推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

C语言函数传递二维数组

   2023-07-22 网络整理佚名1360
核心提示:C语言如果给函数传递二维数组作为参数先看一个传递二维数组的例子:程序看着没有任何问题,但是编译器通不过,报错在处理二维数组参数a的时候,类型不兼容。C语言里面对二维数组的存储是按照一维数组来处理的,二维数组按照行展开的方式按顺序存储,例如在上面的例子中:二维数组a的定义:所以在利用二维数组作为参数传递时,必须指定二维数组的列数,否则函数无法勾画出二维数组的组织形式。传递二维数组的三种方法

如果C语言将二维数组作为参数传递给函数

问题产生

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

#include 
void foo(int a[][], int m, int n) {
    int i = 1;
    int j = 1;
    printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
int main() {
    int a[2][3] = {
        {1,2,3},
        {4,5,6}
    };
    foo(a, 2, 3);
}

编译:

$ gcc test.c
test.c:3:14: error: array type has incomplete element type ‘int[]’
 void foo(int p[][], int m, int n) {
              ^
test.c: In function ‘main’:
test.c:12:9: error: type of formal parameter 1 is incomplete
     foo(a, 2, 3);

程序看起来没问题,但是在处理二维数组参数a时,编译器失败并报出类型不兼容的错误。

原因分析

C语言中二维数组的存储按一维数组处理,二维数组以行展开的方式顺序存储,例如上面的例子:

二维数组a的定义:

int a[2][3] = {
        {1,2,3},
        {4,5,6}
    };

它等价于一维值的定义:

int b[6] = {
        {1,2,3,4,5,6}
    };

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

---+-0-+-1-+-2-+-3-+-4-+-5--
---+---+--+---+--+--+-------
a: | 1 | 2 | 3 | 4 | 5 | 6
b: | 1 | 2 | 3 | 4 | 5 | 6
--+---+--+---+--+--+-------

因此,在传递二维数组作为参数时,必须指定二维数组的列数,否则函数无法勾勒出二维数组的组织形式。 只要有了列长,就可以通过下标a[i][j]得到正确的下标地址,即:

a[i][i] = a[ (i-1) * COLNUM + j ]

让我们更改上面的 foo 函数定义:

void foo(int a[][3], int m, int n) {
    int i = 1;
    int j = 1;
    printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}

编译并运行:

$ gcc test.c
$ ./a.out 
a[1][1]=5

现在正常了。

传递二维数组的三种方式

参数如上所列。

void foo(int a[][3])

#include 
void foo(int (*a)[3], int m, int n) {
    int i = 1;
    int j = 1;
    printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
int main() {
    int a[2][3] = {
        {1,2,3},
        {4,5,6}
    };
    foo(a, 2, 3);
}

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON