如何用C++實現的二維數組?記憶中是否連續?
即如果a
是數組首地址包含再下一個地址a(0,1)
然後a(1,0)
,a(1,1)
等元素a(0,0)
...?
如何用C++實現的二維數組?記憶中是否連續?
即如果a
是數組首地址包含再下一個地址a(0,1)
然後a(1,0)
,a(1,1)
等元素a(0,0)
...?
是的,它在行的主要順序是連續的。假設您有一個名爲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]
。
給定一個聲明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
對象,每個對象是T
型M
對象的contigously存儲列表的連續存儲名單。所以是的,整個二維數組是一個連續存儲的對象。
這是否意味着您可以使用一個組合索引直接訪問元素? 所以,給定一個數組int a[10][5]
,你可以使用a[0][23]
而不是a[2][3]
?嚴格地說,不,因爲這違反了上述第一條規則,即只有索引0..4
對第二條索引有效。但是,就該特定表達而言,如果考慮將a[0]
作爲指針p
指向數組第一行的第一個元素,並將a[0][23]
指定爲*(p+23)
,則可以確保訪問正確的元素。更多關於this existing question這個問題。
簡答:是的。 – chris
謝謝我看到了 – Picowhat
@CodingMash問題是答案的重複? – jogojapan