多次元配列の型崩壊
C では、配列は特定のコンテキストでポインターに型崩壊します。ただし、1 次元配列と多次元配列では動作が異なります。なぜそうなるのでしょうか?
1 次元配列
次のコードを考えてみましょう:
<code class="cpp">int[] arr = {1, 2, 3};</code>
型の減衰により int[] が int に変換されます。 *、
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
これは、int[] が実質的に配列の最初の要素へのポインタに変化するためです。
多次元配列
ただし、この動作は多次元配列には拡張されません。
<code class="cpp">int[][1] arr2 = {{1}, {2}, {3}};</code>
型の減衰は int[][1] を int** に変換しません。代わりに、サイズ 1 の配列へのポインタである int[][1] のままになります。これは、多次元配列でポインタ演算を実行することは、メモリ レイアウトが連続していないため現実的ではないためです。
配列へのポインタ
多次元配列に必要なポインタ型を取得するには、配列へのポインタを作成する必要があります。
<code class="cpp">int*[] arr3 = {arr, arr2};</code>
これは次のように減衰します:
<code class="cpp">int**</code>
これは、最初の次元がポインターであり、2 番目の次元が int*[] が int** に減衰するためです。 array.
影響
この動作を理解することは、多次元配列を関数の引数として渡す場合に重要です。ポインタへのポインタを期待する関数は、それ自体は多次元配列を受け入れることができませんが、配列へのポインタは受け入れることができ、パラメータの受け渡し中にポインタへのポインタに分解されます。この微妙な違いにより、ポインタ演算の一貫性が確保され、メモリ アクセス エラーが防止されます。
以上がC の 1 次元配列と多次元配列で型の減衰が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。