1

为什么这些函数原型不等价?

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

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

1 回答 1

6

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

  • int m[M][N]是一个整数数组的M数组。N

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

您不能将数组作为函数参数传递,因此“K类型的元素数组T”会衰减为“指向-”的指针T,指向数组的第一个元素。因此,将第一种形式写成int m[][N]函数参数是允许和等效的,因为值M丢失了。但是,价值N没有丢失;它是类型的一部分!

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

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}.

对于第二种形式,含义是相当不同的:

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;

then*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])"
于 2012-09-08T11:29:15.733 回答