据我所知,在某些情况下,数组会转换为指向其第一个元素的指针:
int a[5];
int * p;
p = a;
遵循这种方法并考虑到我可以为指针分配一个数组,为什么我不能将二维数组分配给指针指针?
int a[5][5];
int ** q;
q = a;
但是,我可以为指向指针的指针分配一个指针数组:
int * p[5];
int ** q;
q = p;
如果数组转换为指向其第一个元素的指针,则在第二个示例中发生q = a时,a应该是指向[0]的指针,而[0]应该是指向[0]的指针[0],对吧?
此外,如果我这样做,我不会收到错误:
cout << **a;
提前致谢,我希望你能帮助我理解。
答案 0 :(得分:6)
问题是数组int a[5][5];
存储了25个连续int
。
指向像int **q;
这样的数组/指针的指针需要查找到int
的连续指针数组。
这就是您不想进行的任务。
答案 1 :(得分:3)
可以将多维数组分配给单个指针
int a[5][5];
int *p = a;
因为内存被分配为按行组织的单个块。
a = a11 a12 a13
a21 a22 a23
a = a11 a12 a13 a21 a22 a23
答案 2 :(得分:1)
对于多维数组,如果要指向单个(标量)值,则应使用以下声明:
int a[5][5];
int (*q)[5]; /* pointer to five-element array of basic type int */
q = a;
q[0][0]; /* equivalent to a[0][0] */
其中5
是“列”大小(最左边的“行”大小旁边)。通常,对于更多维度,请记住该规则是只有最左侧的大小被声明符的(*q)
部分替换。
实际上当你编写具有多维数组参数的函数时,那么对于编译器,它被认为是上面的形式,例如:
int foo(int a[5][5]) { ... }
实际上被替换为:
int foo(int (*a)[5]) { ... }
答案 3 :(得分:1)
因为更清楚的是让我们考虑你的第一个例子
int a[5];
int * p;
p = a;
可以通过以下方式重写
T a[5];
T * p;
p = a;
其中T是某种类型。
C / C ++中的二维数组是什么?它是一个数组元素,反过来又是一维数组。
所以这个定义
int a[5][5];
可以改写为
T a[5];
其中T的类型为int[5]
我们有
T a[5];
T * p;
p = a;
我们已经知道的T是int[5]
所以p有类型int[5]
数组的指针类型,必须定义为
int ( *p )[5];
p = a;
int ( * )[5]
和int **
是两种不同的类型。
至于此代码
int * p[5];
int ** q;
q = p;
此处T为int *
,因此p定义为T *p
,而int **p