2015-05-20 62 views
1

我已經看到,這些類型的數組有時被視爲矩陣。我有一位老師說這是一個簡單的方法來看待它,而且它看起來的真實方式是線性的。例如:內存中的多維數組結構

int a[2][3][2] = {0, 1, 2, 3 , 4, 5, 6, 7 , 8, 9, 10, 11}; 

你會如何以線性的方式來表示?

+0

也見[這裏](https://stackoverflow.com/questions/13554244/how-to-use-pointer-:

在你的具體的例子,編譯器會在這個結構分配內存表達式訪問元素的二維數組輸入) – CoryKramer

+0

感謝您的建議! –

回答

0

數組是一種數量的元素,連續存儲在記憶中。
2D數組是數組的數組。因此,2D陣列是連續存儲在存儲器中的多個數組。因此,2D陣列的所有元素都被連續存儲在內存中。

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 
    ------- ------- ------- ------- ------- --------- 
    line 0 line 1 line 2 line 3 line 4 line 5 
    ----------------------- ------------------------- 
      block 0     block 1 
    ------------------------------------------------- 
         3D array 
+0

謝謝! @cmaster!這正是尋找的東西! –

4

至於存儲器佈局而言,

int a[2][3][2] = { { { 0, 1 }, { 2, 3 }, { 4, 5 } }, 
        { { 6, 7 }, { 8, 9 }, { 10, 11 } } }; 

相同:

int b[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 

a[i][j][k]相當於b[i * 6 + j * 2 + k]

+0

謝謝! @保羅R你的回答也幫助了我。 –

1

爲了您的三維例如,你可以使用尺寸2*3*2 = 12數組b,並通過b[k + 2 * (j + 3* i)]訪問前元素a[i][j][k]

或者,任何其他重排也可以,例如b[i + 2 * (j + 3* k)]。最佳選擇取決於你如何主要想要遍歷數組。


通常,一個可以在任何陣列

a[0 ... N_1-1][0 ... N_2-1] ... [0 ... N_k-1] 

翻譯成大小N_1 * N_2 * ... * N_k的線性陣列b。在實踐中,你必須改變的唯一事情就是指數函數:所以當你想讓你的原數組訪問元素a[i_1][i_2] ... [i_k],您使用以下代替

b[i_k + N_k * (i_{k-1} + N_{k-1} * (... N_2 * i_1) ...))] 
+0

謝謝朋友!很好的解釋! –