int a[2][3];
int b[2][3];
int d[5][3];
int **q[3] = {a, b, d};
为什么下面这段代码显示错误?
error:a.cpp: In function ‘int main()’:
a.cpp:12:19: error: cannot convert ‘int (*)[3]’ to ‘int**’ in initialization
12 | int **q[3] = {a, b, d};
| ^
| |
| int (*)[3]
a.cpp:12:22: error: cannot convert ‘int (*)[3]’ to ‘int**’ in initialization
12 | int **q[3] = {a, b, d};
| ^
| |
| int (*)[3]
a.cpp:12:25: error: cannot convert ‘int (*)[3]’ to ‘int**’ in initialization
12 | int **q[3] = {a, b, d};
| ^
| |
| int (*)[3]
我尝试更改参数但没有任何反应
这里声明:
int **q[3] = {a, b, d};
....正在声明三个
pointers-to-pointer-to-int
(又名int **
)的数组。
如果
a
、b
和 d
是指针到指针的指针,它会起作用;然而,他们不是那样;相反,它们是二维整数数组。因此类型错误。
如果您想知道有什么区别,请考虑二维数组在内存中始终是一个完全连续的块:即
int a[2][3]
的内容在RAM中的布局如下:
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
... 并计算
a[X][Y]
的地址,编译器会(在内部)生成如下代码:该基地址的适当数组偏移量以计算二维数组中的正确位置。而真正的双间接指针数组应该是这样的:int * ptr = &a[0][0] + (X*3) + Y
这也可以用来访问二维数组的行,但是每次访问都需要两次指针解引用而不是一次,所以效率有点低。不过,这种方法确实具有能够支持“参差不齐”数组的优点(即数组的行彼此长度不同的数组),因此偶尔会出于这个原因使用它。