是否可以将尺寸为A B C的一维const int *const p
指针转换为指向尺寸为[A][B][C]
的多维数组的指针?
答案 0 :(得分:3)
这是如何执行此操作的示例。关键是使用typedef将指针设置为指向指针数组的指针,以免感到困惑。
typedef int (*pint3)[A][B];
在这一行中,我们设置一个类型,该类型指向int的二维指针数组。 2D数组的尺寸等于您最初考虑的尺寸的两个。
如评论中所述,此方法违反了别名。这种类型的指针重新分配容易出错,应该避免。
#include <iostream>
int main() {
int A = 2;
int B = 2;
int C = 3;
int array[]{1, 1, 1, 1, 2, 2, 2,2, 3,3,3,3};
const int *const p = array;
typedef int (*pint3)[A][B];
auto threeDArray = (pint3) p;
std::cout << "Printing 3D array: " << std::endl;
for(int i = 0; i < C; i++ ) {
for(int j = 0; j < B; j++) {
for (int k = 0; k < A; k++) {
std::cout << threeDArray[i][j][k];
}
std::cout << std::endl;
}
std::cout << std::endl;
}
}
输出:
Printing array:
11
11
22
22
33
33
Process finished with exit code 0
答案 1 :(得分:2)
在第一种情况(一个int[A][B][C]
多维数组)中,所有数据都连续放置在内存中,而p[10][20][30]
仅表示*(p + B * C * 10 + B * 20 + 30)
。但是指针指向的是一个指针数组。每个指向另一个指针数组;并且只有那些第二个数组指向数据。数据和第二级指针数组可能不连续。因此,您当然不能使用数据的第一个元素的地址,而使用偏移量来获取所需的内容。
例外情况是某人确实小心地将所有数据连续放置,并且指针数组指向该数据的适当位置。在这种情况下,您可以将&( *(*(*multidim_ptr)))
即&( *(*multidim_ptr))
作为一维指针,可以像p
那样使用。