array 和**数组有什么区别

为什么这些function原型不相同?

void print_matrix(char *name, int SX, int SY, int m[SX][SY]) void print_matrix(char *name, int SX, int SY, int **m) 

即使两个函数参数可以以相同的方式使用,即通过m[i][j] ,它们也是完全不同的:

  • int m[M][N]N int的Marrays的数组。

  • int **m是指向int的指针。

您不能将数组作为函数参数传递,因此“ T类型的K元素数组”会衰减为“指向T指针”,指向数组的第一个元素。 因此,允许并等效于在函数参数中将第一个表单写为int m[][N] ,因为值M将丢失。 但是,值N 不会丢失; 它是该类型的一部分!

因此,对于第一种forms,以下内容是可接受的/错误的:

 void f(int arr[M][N]); int a[M][N]; int b[2*M][N]; int c[M][N + 1]; f(a); // OK f(b); // OK; slowest extent is forgotten in the decay //f(c); // Error! 'c' is not an array of {array of N ints}. 

对于第二种forms,含义相当不同:

 void g(int **p); int a; int * pa = &a; g(&pa); // fine, pointer to 'pa' int arr[M][N]; // g(arr); // Error, makes no sense 

表达式arr指定指向N整数数组数组的第一个元素的指针,即其类型为int (*)[N] 。 取消引用它会得到一个N整数的数组,而不是一个指向整数的指针。

没有办法将表达式arr转换为指向指针的指针:如果你说,

 int ** fool = (int**)arr; 

那么*fool会指向第一个数组的第一个元素( arr[0] ),而不是指向int指针 。 因此,您不能进一步取消引用该值,因为该值不是指针

将二维数组作为双指针传递的唯一正确方法是构造一个中间辅助数组:

 int * helper[M]; // array of pointers for (size_t i = 0; i != M; ++i) { helper[i] = arr[i]; // implicit decay } g(helper); // or "g(&helper[0])"