所以我在一些讲义中有以下例子
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)是非法的。这两个函数都设计为接受二维数组,我们用一个函数调用它们。这怎么不行?我假设区别在于内存的分配,但是这会影响函数如何接受它作为输入?
答案 0 :(得分:2)
你将指针与数组混淆,指针指向二维数组。
这是一个可以理解的错误,因为C(和C ++)的“数组到指针衰减”。有时您可以引用一个数组,并获得指向其第一个元素的指针;有时这是实际的数组 - 取决于上下文。使用二维数组甚至更奇怪,因为二维数组可用于 less 位置而不是指针指向元素(但仍可用于某些这样的地方)。
请在C语言常见问题解答的Section 6中花几分钟时间阅读有关指针和数组如何相关和不同的内容。您的具体问题也出现在那里: