2012-10-14 16 views

回答

1

是的,它在行的主要順序是連續的。假設您有一個名爲a[3][3]的二維數組。然後,在存儲器元件將在這個順序:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]

Here is more details with an example

1

給定一個聲明T D[C],其中T是一個類型名稱,D標識符和C整數表達式中,標準說(突出礦):

(§8.3.4/1)[...],那麼標識符的類型是一個數組類型。 [...]常量表達式指定數組中元素的數量的界限。如果常量表達式的值爲N,則該數組有N個元素,編號爲0到N-1,D的標識符的類型是「N T的派生 - 聲明器類型列表數組」。數組類型的對象包含類型T. N個子對象的連續分配的非空集合[...]

和:

(§8.3.4/ 3)當幾個「特定數組」相鄰,就創建了一個多維數組; [...]

除了:

(§8.3.4/ 9)[注:它從所有這一切,在C數組存儲++逐行(最後標變化如下最快),並且聲明中的第一個下標有助於確定數組消耗的存儲量,但在下標計算中不會有其他部分。 - 注完]

結論
這一切都清楚地表明,T a[N][M]N對象,每個對象是TM對象的contigously存儲列表的連續存儲名單。所以是的,整個二維數組是一個連續存儲的對象。

這是否意味着您可以使用一個組合索引直接訪問元素? 所以,給定一個數組int a[10][5],你可以使用a[0][23]而不是a[2][3]?嚴格地說,不,因爲這違反了上述第一條規則,即只有索引0..4對第二條索引有效。但是,就該特定表達而言,如果考慮將a[0]作爲指針p指向數組第一行的第一個元素,並將a[0][23]指定爲*(p+23),則可以確保訪問正確的元素。更多關於this existing question這個問題。