将Pointer to Pointer转换为多维数组

时间:2018-11-18 12:57:50

标签: c++ pointers

是否可以将尺寸为A B C的一维const int *const p指针转换为指向尺寸为[A][B][C]的多维数组的指针?

2 个答案:

答案 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那样使用。