簡體   English   中英

將Pointer to Pointer轉換為多維數組

[英]Convert Pointer to Pointer to a multi-dimensional array

是否可以將尺寸為A B C的一維const int *const p指針轉換為指向大小為[A][B][C]的多維數組的指針?

這是如何執行此操作的示例。 關鍵是使用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

通常,這是不可能的。

在第一種情況下(一個int[A][B][C]多維數組),所有數據都連續放置在內存中,而p[10][20][30]簡單含義是*(p + B * C * 10 + B * 20 + 30) 但是指針指向的是一個指針數組。 每個指向另一個指針數組; 並且只有那些第二個數組指向數據。 數據和第二級指針數組可能不連續。 因此,您當然不能采用數據的第一個元素的地址,而要使用偏移量來獲取所需的內容。

例外情況是有人確實小心地連續放置所有數據,而指針數組指向該數據的適當位置。 在這種情況下,可以采用&( *(*(*multidim_ptr))) ,即&( *(*multidim_ptr))作為一維指針,可以像p一樣使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM