重複の可能性:
関数への引数としての 2D 配列
2D 配列は C++ でどのように実装されていますか? メモリ内で連続していますか?
つまりa
、配列の場合、最初のアドレスに要素が含まれ、次にa(0,0)
次のアドレスが含まれる、というようになります...?a(0,1)
a(1,0)
a(1,1)
重複の可能性:
関数への引数としての 2D 配列
2D 配列は C++ でどのように実装されていますか? メモリ内で連続していますか?
つまりa
、配列の場合、最初のアドレスに要素が含まれ、次にa(0,0)
次のアドレスが含まれる、というようになります...?a(0,1)
a(1,0)
a(1,1)
はい、行の主要な順序で連続しています。という名前の 2 次元配列があるとします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 の場合、配列は 0 から N-1 までの番号が付けられた N 個の要素を持ち、D の識別子の型は「NT の派生宣言子型リスト配列」です。配列型のオブジェクトには、T 型の N 個のサブオブジェクトの連続して割り当てられた空でないセットが含まれています。 [...]
と:
(§8.3.4/3) 複数の「配列の」仕様が隣接している場合、多次元配列が作成されます。[...]
としても:
(§8.3.4/9) [ 注: これらすべてから、C++ の配列は行単位で格納され (最後の添え字が最も速く変化する)、宣言の最初の添え字が配列によって消費されるストレージの量を決定するのに役立つことがわかりますが、添字の計算では他の役割を果たしません。— 終了注記]
結論以上のことから、が連続して格納されたオブジェクトのリストであり、それぞれが type のオブジェクトの連続して格納されたリストである
ことが明らかになります。そうです、2 次元配列全体が 1 つの連続して格納されたオブジェクトです。T a[N][M]
N
M
T
それは、要素に直接アクセスするために 1 つの結合されたインデックスを使用できるということですか?
したがって、配列が与えられた場合、代わりにint a[10][5]
使用できますか? 厳密に言えば、いいえ。これは、上記の最初の規則に違反しているためです。つまり、2 番目のインデックスにはインデックスのみが有効です。ただし、その特定の式に関する限り、配列の最初の行の最初の要素へのポインターとして考えれば、正しい要素に確実にアクセスできます。この質問の詳細については、この既存の質問を参照してください。a[0][23]
a[2][3]
0..4
a[0]
p
a[0][23]
*(p+23)