为什么在下面的情况中指针数组“等价”不起作用?
void foo(int** x) {
cout << x[0][1];
}
int main( ) {
int a[2][2] = {{1,2},{2,3}};
foo(a);
}
谢谢您
void foo(int** x) {
cout << x[0][1];
}
int main( ) {
int a[2][2] = {{1,2},{2,3}};
foo(a);
}
谢谢您
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]
addr1
和addr2
只是内存中的地址,你无法将一个转换为另一个。
*x
或者 x[INDEX]
? 在这种情况下,需要对 x
进行解引用操作以便能够获得它所指向的 int*
数组类型。 - Jason它不能工作,因为多维数组只有第一层会衰减为指针。请尝试这样做:
#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);
}
因为类型不是 int **,所以这对于 foo 函数是正确的
foo(int *[2]);
指针 a 的类型不是 int **,而是 int* [2]。