所以我在一些讲义中有下面的例子
void f(int **p){}
void g(int *p[]){}
void h(int p[2][3]){}
int main(){
int **a;
allocate_mem(a); // allocate memory for a
f(a); // OK!
g(a); // OK!
// h(a); // NOT OK
int b[2][3];
// f(b); // NOT OK
// g(b); // NOT OK
h(b); // OK!
return 0;
}
(没有任何进一步的解释/评论)。我很难理解为什么 f(b) 和 g(b) 是非法的。这两个函数都设计为接受二维数组,我们用一个来调用它们。这怎么行不通?我认为区别在于内存的分配,但这将如何影响函数接受它作为输入的方式?
最佳答案
您将指针与数组混为一谈,将指向指针的指针与二维数组混为一谈。
由于 C(和 C++)的“数组到指针衰减”,这是一个可以理解的错误。有时您可以引用一个数组,并获得指向其第一个元素的指针;有时它是实际的数组 - 取决于上下文。对于二维数组,它变得更加奇怪,因为二维数组可以在较少的地方使用,而不是指向元素的指针(但仍然可以在中使用>一些这样的地方)。
请花几分钟阅读 Section 6 中的指针和数组之间的关系和区别。 C语言常见问题解答。您的具体问题也出现在那里:
关于C、动态分配一个矩阵: Why is this not allowed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49966307/