关于c ++:将int [] []赋值给int **

assign int[][] to int**

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
int a[5];
int * p;

p = a;

按照这种方法,考虑到我可以为指针分配一个数组,为什么不能为指向指针的指针分配一个二维数组呢?

1
2
3
4
int a[5][5];
int ** q;

q = a;

但是,我可以为指向指针的指针分配一个指针数组:

2

如果将数组转换为指向第一个元素的指针,则当第二个示例中出现q=a时,a应为指向[0]的指针,而[0]应为指向[0][0]的指针,对吗?

此外,如果我这样做,我不会出错:

1
cout << **a;

事先谢谢,希望你能帮助我理解。


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

指向数组/指针(如int **q;的指针)希望找到指向int的连续指针数组。

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


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

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

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

1
2
3
4
a = a11 a12 a13
    a21 a22 a23    

a = a11 a12 a13 a21 a22 a23


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

1
2
3
4
int a[5];
int * p;

p = a;

可以用以下方式重写

1
2
3
4
T a[5];
T * p;

p = a;

其中t是某种类型。

C/C++中的二维数组是什么?它是一个数组元素,其中的元素依次是一维数组。

所以这个定义

1
int a[5][5];

可以重写为

1
T a[5];

其中t为int[5]

我们有

1
2
3
4
T a[5];
T * p;

p = a;

其中t,我们已经知道是int[5],所以p有指向int[5]类型数组的指针类型,必须定义为

1
2
3
int ( *p )[5];

p = a;

int ( * )[5]int **是两种不同的类型。

关于这个代码

1
2
3
4
int * p[5];
int ** q;

q = p;

当t是int *时,p被定义为T *p,反过来是int **p


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

2

其中,5是"列"大小(在最左边的"行"大小旁边)。一般来说,对于更大的维度,请记住,规则是只将最左边的大小替换为声明器的(*q)部分。

事实上,当您编写具有多维数组参数的函数时,对于编译器来说,它被视为上述形式,例如:

1
int foo(int a[5][5]) { ... }

有效替换为:

1
int foo(int (*a)[5]) { ... }