C语言传递二维数组时报错expected ‘int **’ but argument is of type ‘int (*)[3]’如何解决
错误根因
你定义的二维数组int array[2][3]属于数组类型的数组,它在传参时会退化为指向其首元素的指针,类型为int (*)[3](指向长度为3的int数组的指针),和你函数声明的int**(指向int指针的指针)类型完全不匹配,因此编译器抛出类型不兼容错误。
解决方法
方法1:使用变长数组(C99及以上标准支持,推荐)
这种写法不绑定第二维的固定长度,适配不同大小的二维数组,且不需要额外构造指针,直接传原数组即可,修改数组元素会同步修改原数组内容,符合你的需求:
#include <stdio.h> #include <stdlib.h> // 注意数组维度参数要放在数组参数之前,才能让编译器识别长度 void Func(int sizeFirst, int sizeSecond, int matrix[sizeFirst][sizeSecond]) { for (int i = 0; i < sizeFirst; i++) { for (int j = 0; j < sizeSecond; j++) { printf("%d\n", matrix[i][j]); // 直接对matrix[i][j]赋值就会修改原数组 } } } int main() { int array[2][3] = { {5,8,2}, {1,3,6} }; int sizeMain = sizeof(array)/sizeof(array[0]); int sizeInner = sizeof(array[0])/sizeof(array[0][0]); Func(sizeMain, sizeInner, array); return 0; }
你也可以把参数里的数组写法等价替换为指针形式:int (*matrix)[sizeSecond],效果完全一致。
方法2:第二维长度固定时的写法
如果你使用的编译器不支持C99变长数组,且二维数组的第二维长度固定为3,可以直接声明参数为指向固定长度数组的指针:
// 第二维长度固定为3 void Func(int (*matrix)[3], int sizeFirst, int sizeSecond) { // 内部逻辑和方法1完全一致 }
方法3:强制适配int**参数的写法
如果必须保留原函数的int**参数类型,需要额外构造一层指针数组,再把指针数组传入函数:
int main() { int array[2][3] = { {5,8,2}, {1,3,6} }; // 构造指针数组,每个元素指向二维数组的每一行 int* ptr_arr[2] = {array[0], array[1]}; int sizeMain = sizeof(array)/sizeof(array[0]); int sizeInner = sizeof(array[0])/sizeof(array[0][0]); Func(ptr_arr, sizeMain, sizeInner); return 0; }
这种方法修改matrix[i][j]依然会修改原数组,但多了一层指针数组的开销,不如前两种方法高效。
内容的提问来源于stack exchange,提问作者Akira
相关产品推荐
相关产品推荐

