矩阵,指针,C *

我有这样的代码:

void print_matrix(int **a, int n) { int i, j; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) printf("%d\t", *(a+i*n+j)); putchar('\n'); } } int main () { int matrix[3][3]; insert (matrix); /* Function that reads Matrix from stdin */ print_matrix(matrix, 3); return 1; } 

我收到GCC错误:

期望’int **’但参数类型为’int(*)[3]

我阅读了所有相关主题,但我仍然无法找到我的问题的答案,因此在将其标记为重复之前,请阅读它。

指针不是数组,我理解。 我已经读过元素不是顺序的地方,在这种情况下,这可能发生:111 222 333 – > 111是第一个int数组的地址,222是第二个int数组的地址,333是第三个int数组的地址。 但如果是这种情况,我不明白为什么GCC给我一个错误。

首先,我希望有人向我确认我所读到的内容是真的。 如果有人能给我回答,我真的很感激。

请注意,我知道*(a+i*n+j)在矩阵的内存不是连续的情况下是不正确的。

最好的祝福。

当你传递int[3][3] ,函数会收到一个指向(int*)[3]指针,这是一个指向3 int数组的指针 。 因为当您将数组传递给函数时,它会转换为指向其第一个元素的指针。

因此,相应地调整function。 一种方法是将其作为指向数组的指针接收。 你的数组索引也是错误的。 您可以像索引真实数组一样索引。

 void print_matrix(int (*a)[3], int n) { int i, j; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) printf("%d\t", a[i][j]); putchar('\n'); } } 

如果您使用C99,则可以传递两个维度:

 void print_matrix(int x, int y, int a[x][y]) { int i, j; for(i = 0; i < x; i++) { for(j = 0; j < y; j++) printf("%d\t", a[i][j]); putchar('\n'); } } 

并称之为:

  print_matrix(3, 3, matrix); 

只是为了说明如何访问各个“数组”:

 void print_matrix(int (*a)[3], int n) { int i, j; for(i = 0; i < n; i++) { int *p = a+i; for(j = 0; j < 3; j++) printf("%d\t", p[j]); putchar('\n'); } } 

如果你想要n变化(并且是正方形),最好分配和使用单个维度数组,并在需要不同的行时相乘。

 int matrix[3*3]; 

如何使用它?

 matrix[row*3+col] = 5; 

如何传递它。

 f(int *a,int n) 

int**指向指针的指针 (指向int)。

int[3][3] ,作为函数参数,转换为指向int数组指针 – 请参阅数组名是指针吗?

所以类型不匹配,正如编译器告诉你的那样。

注意:如果你在函数中进行指针运算,你可以传递int *a而不是int **a (通过cast: print_matrix((int *)matrix, 3);这很难看,但有助于理解发生了什么- 即, int[3][3]数组完全作为int[9]数组存储在内存中,如果你自己计算int位置,就像你一样,它也可以作为一维数组工作。