C语言函数传递二维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言函数传递二维数组相关的知识,希望对你有一定的参考价值。

参考技术A C语言如果给函数传递二维数组作为参数

先看一个传递二维数组的例子:

编译:

程序看着没有任何问题,但是编译器通不过,报错在处理二维数组参数a的时候,类型不兼容。

C语言里面对二维数组的存储是按照一维数组来处理的,二维数组按照行展开的方式按顺序存储,例如在上面的例子中:
二维数组a的定义:

它等同于一维数值的定义:

因为他们的空间存储分配一样的。

所以在利用二维数组作为参数传递时,必须指定二维数组的列数,否则函数无法勾画出二维数组的组织形式。只有有了列长度,通过下标a[i][j]时才能得到正确的下标地址,即:

我们改一下上面的额foo函数定义:

编译运行:

这下就正常了。

参数如上所列。

我们看到,函数的参数声明改成了:

这个声明的含义是:

不过此时还是需要指定二维数组的列长度,不然函数内部还是无法使用二维下标去访问数组:

编译:

原因同前面方法1一致,如果要访问二维数组,必须指定列的长度,否则无法计算出该元素的地址,a[i][j]=a [ (i-1)*COLNUM + j ],如果没有COLNUM,那么这个地址无法计算出来。从形参的声明来说,a就是一个指针,指向一维数组的指针,而不是一个二维数组。

这里要注意的是指针的指针,和二维数组的差异;二维数组的地址是连续的,所有成员按顺序排序;而指针的指针只要求指针地址连续,而不要求指针的指针地址连续。

然后作为实参传递时,也不能直接使用a传递,因为类型不匹配,必须定义新的变量p,然后把a的值赋给p,再传递给foo函数。

C语言二维数组问题

比如 int matrix[4][4]。
这个matrix 是二级指针吗?
我试过,在我的机器上,int *或者int **都不行。
那怎么调用二级数组啊?
我想知道定义一个函数中如何调用:
int main(int **)形参想读入一个二维数组,怎么办?

不是
这么说吧,数组名本身就是指针,指向数组的第一个元素

至于你所说的调用调用二级(二维吧)数组,难道不是如普通变量般直接调用吗?

根据问题补充说,这是不允许的,main()函数的形参是固定的不能传递指针。而一般的自定义函数只能用传递首地址的形式来传递二维数组,例子如下:

定义:int a[X][Y];
int func(int *p,int x,int y) //x,y即为调用x行y列的元素
printf("%d\n",p+x*X+y); //这里是通过计算指针位置实现
return 0;
调用: func(a,3,3);

这种通过计算地址方法调用相当麻烦。。可以考虑将数组定义在结构中,再将结构进行形参传递,当这样会降低效率...例子如下

#include<stdio.h>

typedef struct
int a[5][5];TE;
TE test;
int func(TE a,int x,int y)
printf("%d\n",a.a[x][y]);
return 0;

int main()

test.a[3][3]=5;
func(test,3,3);

getch();
return 0;
参考技术A matrix[i]就是指向二级数组的第i+1个数组的首地址的常量指针 参考技术B martrix本身就是一个指针,调用的话直接当已经声明的指针用,不需要额外声明。

以上是关于C语言函数传递二维数组的主要内容,如果未能解决你的问题,请参考以下文章

c语言中怎么用二维数组作为函数参数

C语言二维数组问题

C语言中如何将二维字符数组作为函数参数引用传递

c语言中怎么用二维数组作为函数参数

C 语言数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

C语言如何在子函数中对主函数中的二维数组值进行修改? 二维数组已经在主函数中用动态数组分配了空间。