【发布时间】:2011-11-25 02:49:49
【问题描述】:
为什么下面的程序会给出'conversion' : cannot convert from int[1][1] to int** 错误?我在 Windows 7 下用 VS2008 编译。
int main(){
int a[1][1] = {0};
int **p = a;
}
【问题讨论】:
-
数组不是指针。 数组不是指针.
为什么下面的程序会给出'conversion' : cannot convert from int[1][1] to int** 错误?我在 Windows 7 下用 VS2008 编译。
int main(){
int a[1][1] = {0};
int **p = a;
}
【问题讨论】:
您只能将数组转换为指针一次。 “指针 == 数组”抽象从第二级开始中断。
你可以的
int (*p)[1] = a; //convert an array of arrays of length 1
// to a pointer to arrays of length 1
但很明显,如果您在每种情况下都看到内存布局,则无法将多维数组转换为指针到指针:
//multidimentional arrays (a[][])
a -> [first row][second row][...]
//pointers to pointers (**p)
p -> [p0][p1][p2]
| | |
| | \-> [third row]
| \-----> [second row]
\----------> [first row]
在指针到指针的方法中,行不一定是连续的,需要有一个额外的数组用于指向各个行的脊椎。
【讨论】:
a是ints数组的数组,所以它可以衰减为指向第一个元素的指针,即ints数组。所以需要如下声明指针:
int (*p)[1] = a;
更抽象地说,如果你有一个数组T a[N];,那么a 会衰减为T*。在你的情况下,你有T = int[M],所以T* = int(*)[M]。
【讨论】:
int *[M](结果是一行指针,而不是指向一行的指针)。与运算符优先级不同,邻接问题很直观。