指针和数组

4
为什么在下面的情况中指针数组“等价”不起作用?
void foo(int** x) {
  cout << x[0][1];
}

int main( ) {
  int a[2][2] = {{1,2},{2,3}};
  foo(a);  
}

谢谢您


6
什么不起作用?你收到了什么错误信息? - Daniel
可能是在C语言中,数组是指针还是被用作指针?的重复问题。 - ildjarn
指针数组 "equivalence" - user695652
@ildjam,不是重复的,那里讨论了1D情况,指针数组“等价性”适用于该情况。 - user695652
4
“指针数组等价性”这个概念从来就不存在。事实上,你的例子直接证明了这一点。 - AnT stands with Russia
@user695652:那里被接受的答案也回答了你的问题。 - ildjarn
3个回答

11

int**和int[2][2]的内存模型是不同的。
int a[2][2]在内存中的存储方式为:

&a     : a[0][0]
&a + 4 : a[0][1]
&a + 8 : a[1][0]
&a + 12: a[1][1]

int **x

&x       : addr1
&x + 4   : addr2
addr1    : x[0][0]
addr1 + 4: x[0][1]
addr2    : x[1][0]
addr2 + 4: x[1][1]

addr1addr2只是内存中的地址,你无法将一个转换为另一个。


1
&x 变量的类型应该是 int*** ... 你是不是指的 *x 或者 x[INDEX]? 在这种情况下,需要对 x 进行解引用操作以便能够获得它所指向的 int* 数组类型。 - Jason
实际上应该使用 x 而不是 &x,因为 &x 是两个地址的地址。 - Daniel

4

它不能工作,因为多维数组只有第一层会衰减为指针。请尝试这样做:

#include <iostream>
using std::cout;

void foo(int (*x)[2]) {
  cout << x[0][1];
}

int main( ) {
  int a[2][2] = {{1,2},{2,3}};
  foo(a);
}

0

因为类型不是 int **,所以这对于 foo 函数是正确的

foo(int *[2]);

指针 a 的类型不是 int **,而是 int* [2]。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接