将 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** [重复]的主要内容,如果未能解决你的问题,请参考以下文章