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

assign int[][] to int**

本文关键字:int 赋值      更新时间:2023-10-16

据我所知,在某些上下文中,数组被转换为指向其第一个元素的指针:

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应该是指向a[0]的指针,a[0]应该是指向a[0][0]的指针,对吗?

此外,如果我这样做,我不会得到错误:

cout << **a;

提前感谢,希望您能帮助我理解

问题是数组int a[5][5];存储了25个连续的int

指向数组/指针的指针,如int **q;,期望找到指向int的连续指针数组。

这就是为什么你想做的任务是不可能的。

多维数组可以赋值给单个指针

int a[5][5];
int *p = a;

,因为内存是按行组织的单个块分配的。

a = a11 a12 a13
    a21 a22 a23    
a = a11 a12 a13 a21 a22 a23 

为了更清楚,让我们考虑第一个例子

int a[5];
int * p;
p = a;

In可以这样重写

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

对于多维数组,如果您想指向单个(标量)值,那么您应该使用以下声明:

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]) { ... }