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; |
事先谢谢,希望你能帮助我理解。
问题是数组
指向数组/指针(如
这就是为什么你想做的任务是不可能的。
多维数组可以分配给单个指针
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为
我们有
1 2 3 4 | T a[5]; T * p; p = a; |
其中t,我们已经知道是
1 2 3 | int ( *p )[5]; p = a; |
关于这个代码
1 2 3 4 | int * p[5]; int ** q; q = p; |
当t是
对于多维数组,如果要指向单个(标量)值,则应使用以下声明:
2其中,
事实上,当您编写具有多维数组参数的函数时,对于编译器来说,它被视为上述形式,例如:
1 | int foo(int a[5][5]) { ... } |
有效替换为:
1 | int foo(int (*a)[5]) { ... } |