将 int[][] 分配给 int** [重复]

Posted

技术标签:

【中文标题】将 int[][] 分配给 int** [重复]【英文标题】:assign int[][] to int** [duplicate] 【发布时间】:2014-10-10 05:20:41 【问题描述】:

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

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;

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

【问题讨论】:

数组不是指针(在某些情况下它会衰减到它 _ 即函数调用)。同样,二维数组不是指向指针的指针。二维数组不是指针数组,它们也不同 您不能分配它,因为您不仅要对变量进行分配,而且还要分配大小为 [5][5] 的内存。您为指针或 int **q 的指针分配内存的方式不同。您首先像这样分配内存: int **q = new int *[5]; for(int i= 0; i 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

一个多维数组可以分配给单个指针

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

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

a = a11 a12 a13
    a21 a22 a23    

a = a11 a12 a13 a21 a22 a23 

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

对于多维数组,如果要指向单个(标量)值,则应使用以下声明:

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

【讨论】:

以上是关于将 int[][] 分配给 int** [重复]的主要内容,如果未能解决你的问题,请参考以下文章

c ++动态指针数组[重复]

将布尔值自动提升为 int [重复]

将 int ** 分配给 int 指针

将 Int 指针分配给 double 变量

将短路分配给 int * 失败

将 const int 分配给指向 int 的 const 指针是非法的吗?