在C程序中的函数中传递2D数组

下面的程序(将数组传递给函数的玩具程序)不能编译。 请解释一下, 为什么编译器无法编译(由于技术原因或标准原因?

我还会看一些解释指针/多维数组的书(因为我对它们不满意),但是这里的任何现成指针都应该是有用的。

void print2(int ** array,int n, int m); main() { int array[][4]={{1,2,3,4},{5,6,7,8}}; int array2[][2]={{1,2},{3,4},{5,6},{7,8}}; print2(array,2,4); } void print2(int ** array,int n,int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) printf("%d ",array[i][j]); printf("\n"); } } 

这个(像往常一样)在c faq中解释。 简而言之, 一个数组仅衰减一次指针 (在它衰减之后,结果指针不会进一步衰减)。

数组数组(即C中的二维数组) 衰减为指向数组的指针,而不是指向指针的指针

最简单的解决方法:

 int **array; /* and then malloc */ 

在C99中,作为接收“可变长度数组”的函数的简单规则,首先声明边界:

 void print2(int n, int m, int array[n][m]); 

然后你的function应该像你期望的那样工作。

编辑:通常,您应该查看指定维度的顺序。 (和我:)

在您的代码中,双指针不适合访问2D数组,因为它不知道它的跳数,即列数。 2Darrays是连续分配的存储器。

以下类型转换和2D数组指针可以解决问题。

 # define COLUMN_SIZE 4 void print2(int ** array,int n,int m) { // Create a pointer to a 2D array int (*ptr)[COLUMN_SIZE]; ptr = int(*)[COLUMN_SIZE]array; int i,j; for(i = 0; i < n; i++) { for(j = 0; j < m; j++) printf("%d ", ptr[i][j]); printf("\n"); } }