c语言用函数处理二维数组 c语言二维数组函数怎么用

c语言中 strcpy函数是否可以用于二维数组?可以的,二维数组本身就是由多个一维数组组成的,对二维数组其中的一维数组分别使用strcpy即可:
#include iostream
using namespace std;
void main()
{
char* str = "hello world!";
char arr[100][100];
strcpy(arr[0], str);
coutarr[0]endl; //输出hello world!
}
如果不是逐个一维数组拷贝,那可以使用memcpy函数:
#include iostream
using namespace std;
void main()
{
char* str = "hello world!";
char arr[100][100];
memcpy(arr,str,13);
coutarr[0]endl; //输出hello world!
}
C语言函数传递二维数组C语言如果给函数传递二维数组作为参数
先看一个传递二维数组的例子:
编译:
程序看着没有任何问题,但是编译器通不过 , 报错在处理二维数组参数a的时候,类型不兼容 。
C语言里面对二维数组的存储是按照一维数组来处理的 , 二维数组按照行展开的方式按顺序存储,例如在上面的例子中:
二维数组a的定义:
它等同于一维数值的定义:
因为他们的空间存储分配一样的 。
所以在利用二维数组作为参数传递时 , 必须指定二维数组的列数,否则函数无法勾画出二维数组的组织形式 。只有有了列长度,通过下标a[i][j]时才能得到正确的下标地址,即:
我们改一下上面的额foo函数定义:
编译运行:
这下就正常了 。
参数如上所列 。
我们看到,函数的参数声明改成了:
这个声明的含义是:
不过此时还是需要指定二维数组的列长度,不然函数内部还是无法使用二维下标去访问数组:
编译:
原因同前面方法1一致,如果要访问二维数组,必须指定列的长度,否则无法计算出该元素的地址,a[i][j]=a [ (i-1)*COLNUMj ],如果没有COLNUM,那么这个地址无法计算出来 。从形参的声明来说 , a就是一个指针,指向一维数组的指针 , 而不是一个二维数组 。
这里要注意的是指针的指针 , 和二维数组的差异;二维数组的地址是连续的,所有成员按顺序排序;而指针的指针只要求指针地址连续 , 而不要求指针的指针地址连续 。
然后作为实参传递时,也不能直接使用a传递 , 因为类型不匹配,必须定义新的变量p,然后把a的值赋给p , 再传递给foo函数 。
如何用函数修改二维数组使用二维数组作为参数时,(以整数为例)规范写法一般是:int
s[3][3]或int
s[][3]或int
(*s)[3] 。
当然,如果你很熟练C语言,也可以使用int
**s的形式(
【c语言用函数处理二维数组 c语言二维数组函数怎么用】实际上可以使用任何形式
),这时只需要在函数内部做相应的处理即可,C语言相当灵活 。初学者不建议使用 。
下面在手机上用易历知食app里的微C程序设计编写个示例,演示使用规范的写法 。程序中,函数Array1将二维数组的值设置为100-108之间;函数Array2将二维数组的值设置为200-208之间;函数PrintArray则打印出二维数组的值 。从结果看,函数成功修改了二维数组的值了 。
手机上C语言代码如下图:
手机上运行效果如下图:
c语言二维数组怎么用函数一个一个调用,这样对吗对的,是我的第二种方法 。
1.可以用指针 。
void
Func(int
**array,
int
m,
int
n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
*((int*)array
n*i
j);
2.可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大?。?也可以省略第一维的大小说明,如:
void
Func(int
array[3][10]);
void
Func(int
array[][10]);
二者都是合法而且等价 , 但是不能把第二维或者更高维的大小省略 , 如下面的定义是不合法的:
void
Func(int
array[][]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多
少列 , 不能只指定一维而不指定第二维 , 下面写法是错误的:
void
Func(int
array[3][]);
实参数组维数可以大于形参数组,例如实参数组定义为:
void
Func(int
array[3][10]);
而形参数组定义为:
int
array[5][10];
这时形参数组只取实参数组的一部分 , 其余部分不起作用 。
如何通过函数调用二维数组C语言编程的过程中,不可避免的会碰到二维或二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组 。最近在编程的过程中就碰到了这个问题:有如下的测试程序:
voidtest(double**x,int Row,int Col);
voidtest(double**x)
{
for(int i=0;iRow;i)
for(int k=0;kCol;k)
x[i][k]= 100.0;
}
intmain(int argc, char *argv[])
{
/*
double **x;
x = new double *[3];
for(int i=0;i3;i)
x[i] = new double[3];
*/
double x[3][3];
for(int i=0;i3;i)
for(int k=0;k3;k)
x[i][k] = i*k;
test(x,3,3);
for(int i=0;i3;i)
for(int k=0;k3;k)
printf("x[%d][%d]= %e\n",i,k,x[i][k]);
getch();
return 0;
}
编译时提示Cannot convert 'double [*][3]' to double **' 。
将调用方式强制进行类型转换:test((double **)x),编译通过,运行出错,提示非法越界 。
据传:因为栈上分配的数组和堆上分配的数组在内存排列上可能不相同,直接定义的数组是存储在程序的堆栈区,数据占用连续的区间;而动态申请的数组是在系统的远堆上(far heap),除最后一维的元素是连续存放的外,其他维上的元素有可能不是在一块连续的内存区域里 。
//栈上:
intia[2][2]= {2,3,4,5};//4个元素是连续排列的内存段
//堆上:
int**p=newint*[2];//只有每行内是连续排列,各行并不一定连续排列
for ( inti= 0;i2; i)
{
p[i]=newint[2];
}
for ( inti=0;i2;i)
{
for ( intj=0;j2;j)
{
p[i][j]=ia[i][j];
}
}
所以对栈上的数组用int**p指向首地址,因为int**p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错 。
如果找一个通用方程只能用:
voidf( int*p, introw,intcol )//给出数组的行和列,对堆上的数组不合适
{
for ( inti =0;irow;i)
{
for ( intj=0;jcol;j)
{
coutp[i * rowj]"";
}
coutendl;
}
}
intmain(){
//.........
intia[2][2]={2,3,4,5};
f( (int*)ia, 2, 2 );
}
采用上面的通用办法还是比较麻烦 , 这无形中对编程增加了难度,为了避免这个麻烦可以采用动态数组的形式,将原来采用直接定义的数组全部换成动态数组,类似开头例子中被注释掉的那部分代码,当然这样也有后续的麻烦,动态数组的生命周期完成后必须释放内存空间,这也有点罗嗦,但是毕竟可以直接使用数组的形式,比上面的通用方式还是要简单一点 。
如果执意要使用直接定义的数组该怎么办呢?有如下几种方法:
方法一:
voidtest(double(*x)[3], int Row, int Col);
调用方式:test(x,Row,Col);
调用用方式 test(x,Row,Col);
方法二:
voidtest(doublex[][3], int Row,int Col);
调用方式 test(x,Row,Col);
对于多维数组作为参数,除第一维之外的其它维必须指定维数,否则是肯定编译不过去的 。
从上面的对直接定义的数组的引用情况看,直接定义的数组的使用比较麻烦,一旦直接定义数组的维数发生变换,函数的定义必须相应的修改,否则程序就会出错,这也增加了程序进一步开发的麻烦,为了一劳永逸的解决这个问题,建议还是使用动态数组的方法 , 虽然需要手工释放内存,但是除却了后续的麻烦 。
C语言如何给用函数二维数组动态赋值1、当成普通数组使用,用for循环即可赋值 。
2、例程:
#include
#include
int
main(void)
{
int
*a=NULL;
int
i;
a=malloc(sizeof(int)*10);/*动态创建一个有10个int元素的数组*/
if
(a==NULL)
{
/*a==NULL表示空间分配失败*/
fprintf(stderr,"MEMORY
ERROR");
return
-1;
}
for
(i
=
0;
i
10;
i)
{
a[i]=i;
/*对数组进行赋值操作*/
}
free(a);/*动态分配的空间需要用free()函数释放*/
return
0;
}
c语言用函数处理二维数组的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言二维数组函数怎么用、c语言用函数处理二维数组的信息别忘了在本站进行查找喔 。

    推荐阅读