2012-09-28 116 views
1

我在向4d數組中聲明指針時遇到問題。通過指針從C中訪問4d數組中的元素

我已經宣佈它是這樣的:

int matrix[7][4][5][5] = 
{ 
    {/* Section 1 */ 
    { 
     /* 1st */ 
     {0,0,1,0,0}, 
     {0,0,1,0,0}, 
     {0,0,1,0,0}, 
     {0,0,0,0,0}, 
     {0,0,0,1,0} 
    }, 
    { 
    /* 2nd */ 
     {0,0,0,0,0}, 
     {0,0,0,0,0}, 
     {1,0,0,1,1}, 
     {0,0,0,0,0}, 
     {0,0,0,0,0} 
    }, 
    . . . 
    }/* End Section 1 */ 
} 

我希望能夠打印出二維數組中的元素註釋/* 2nd */下方。

我有一些代碼遍歷一個二維數組是這樣的:

for(int i = 0; i < 5; i++) 
    { 
    for(int j=0; j<5; j++) 
    { 
     std::cout << " " << pMatrixPtr[i][j]; 
    } 
    std::cout << "\n"; 
    } 

但我的問題是 - 我不知道該怎麼設置pMatrixPtr,或者什麼類型應該是(我的意思是水平指針......應該是**?)。沒有我嘗試似乎編譯,我認爲這是因爲我不完全明白涉及什麼類型。

任何人都可以解釋如何通過指針訪問4D數組,以及該指針應該指向什麼?

回答

3
int (*pMatrixPointer)[5] = matrix[0][1]; 

將設置pMatrixPointer指向第二個二維陣列中matrix。這樣,你會在你的代碼上述使用它:

for(int i = 0; i < 5; i++) 
{ 
    for(int j=0; j<5; j++) 
    { 
    std::cout << " " << pMatrixPtr[i][j]; 
    } 
    std::cout << "\n"; 
} 

爲什麼這個工程:

在大多數情況下,數組類型的表達式將被轉換爲指針類型的表達式,值了表達式將是數組中第一個元素的地址(這對於C和C++都是如此)。

表達式matrix[0][1]具有「int」的5元件陣列的類型「5元件陣列」;通過上述規則,表達式被轉換爲類型「指向5個元素的數組int」(int (*)[5])並且值爲&matrix[0][1]

表達式a[i]相當於*(a + i);在下標操作中有一個隱含的解引用。所以pMatrix[i]相當於*(pMatrix + i),這產生了一個指針值,我們進一步用j來抵消,如*(*(pMatriux + i) + j)

+0

@優秀 - 感謝您的解釋。 – BeeBand

3

如果你想打印只是下方留言內容/ 第二 /這時你可以手動選擇前兩個陣列塊和應用循環的最後兩個街區,如...

for(int i=0;i<5;i++) 
{ 
    for(int j=0;j<5;j++) 
    { 
     std::cout<<" "<<matrix[7][1][i][j]; 
    } 
    std::cout<<"\n"; 
} 

使用指針會使它變得複雜。

+0

我實際上認爲使用指針會使得代碼*更少*複雜。 – BeeBand

1

指針到4D數組是不是很容易既不能讀從頭定義,我總是使用typedef的幫助:

typedef int MATRIX_1D[5]; // 5 element array of int 
    typedef int* MATRIX_1D_PTR; // pointer to int array 
    typedef MATRIX_1D MATRIX_2D[5]; // 5 element array of 5 element array of int 
    typedef MATRIX_1D* MATRIX_2D_PTR; // pointer to array of 5 element array of int 
    typedef MATRIX_2D MATRIX_3D[4]; // 4 el. arr. of 5 el. arr. of 5 el. arr. of int 
    typedef MATRIX_2D* MATRIX_3D_PTR; // pointer to arr. of 5 el. arr. of 5 el. ... 
    typedef MATRIX_3D MATRIX_4D[7]; // 7 el. arr. of 4 el. arr. of 5 el. arr. of 5... 
    typedef MATRIX_3D* MATRIX_4D_PTR; // pointer to array of 4 element array of ... 

因此,對於您的情況:

MATRIX_2D_PTR pMatrixPtr = matrix[0][0];  
for(int i = 0; i < 5; i++) 
    { 
    for(int j=0; j<5; j++) 
    { 
     std::cout << " " << pMatrixPtr[i][j]; 
    } 
    std::cout << "\n"; 
    } 

正如你可以看到pMatrixPtr是指向由int類型的5個元素組成的數組的數組的指針。這是我如何定義MATRIX_2D_PTR類型。

作爲獎勵的答案 - 的方式如何在整個矩陣迭代:

void printMatrix(MATRIX_4D_PTR* p) 
    { 
    for (int i1 = 0; i1 < 7; ++i1) 
    for (int i2 = 0; i2 < 4; ++i2) 
     for (int i3 = 0; i3 < 5; ++i3) 
     for (int i4 = 0; i4 < 5; ++i4) 
     std::cout << p[i1][i2][i3][i4] << std::endl; 
    } 
    int main() { printMatrix(matrix); } 
+0

感謝您的答覆Piotr。也許在這種情況下,可讀性取決於個人偏好。 – BeeBand

+0

我想我的意思是說,如果我使用了這樣一個typedef序列,那麼我最終會通過所有typedef來追蹤'MATRIX_2D_PTR',看看它是如何定義的。在調試時(例如),我會發現'int(* pMatrixPointer)[5]'聲明更容易閱讀。但這完全是我個人的偏好。 :-) – BeeBand

+0

@BeeBand瞭解。數組數組不是很難理解/定義。考慮函數指針的數組 - 'int(* p [4])(int x,int y);',我更喜歡typedefs。味道的問題。對於C++初學者來說可能更容易理解。 – PiotrNycz