将int [] []赋值给int **

时间:2014-08-16 20:58:47

标签: c++ c arrays pointers

据我所知,在某些情况下,数组会转换为指向其第一个元素的指针:

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;

提前致谢,我希望你能帮助我理解。

4 个答案:

答案 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