C では、配列は次のような固有の減衰ルールを示します。次元とポインタの存在によって異なります。この現象は、減衰時の 1 次元配列 (int[]) と 2 次元配列 (int[][]) の動作を比較すると観察できます。
1 次元配列: int*[] は int
に減衰します。 int[] などの 1 次元配列が減衰する場合、最初の要素へのポインターのように動作します。これは、次のコードで明らかです。
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
このコードは、int[] の減衰によって int* が生成されるため、true を返します。これは、整数へのポインターのように動作することを示しています。
2 次元配列: int[][1] は int
に減衰しません。1 次元配列とは対照的に、2 次元配列 (int[][]) は int
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
に減衰しません。ポインタからポインタへのポインタ (int**)。代わりに、配列の性質を保持します。これは、次のコードで示されています。
このコードは false と評価され、int[][1] の減衰によって int** が生成されないことを示します。
配列の崩壊におけるポインタの役割
これら 2 つのケースの主な違いは、ポインタの関与にあります。 1 次元配列が int<code class="cpp">std::is_same<int**, std::decay<int*[]>::type>::value; // true</code>
* に減衰する理由を説明しています。理由: なぜ int
[][]ではないのか?
2 次元配列がポインタへのポインタに崩壊しない理由は、ポインタ演算の実行が困難になるためです。 2 次元配列では、各要素はメモリの連続ブロック内の特定のオフセットに格納されます。要素にアクセスするには、コンパイラーは両方の次元のサイズを知る必要があります。これが int** に崩壊すると、この重要な情報が失われ、ポインターの演算が不可能になります。以上がなぜ `int[]` は `int*` に分解されるのに、 `int[][]` には分解されないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。