[英]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.