配列における型の減衰: int* と int[][]
C では、配列は特定のコンテキストでポインターに減衰します。関数に渡すときやポインタに代入するときと同様です。ただし、この減衰動作は配列の次元数によって異なる場合があります。
次のコードを考えてみましょう。
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
最初の行は正常にコンパイルされ、int[] 配列が次のように減衰することが確認されます。 int ポインタ。ただし、2 行目は失敗し、int[][1] 2 次元配列が int* ポインターに分解されないことを示しています。
この矛盾の理由は、ポインター演算の性質にあります。 。 int[] のような 1 次元配列では、各要素がメモリに連続して格納されます。これにより、配列へのポインタをインクリメントまたはデクリメントして、隣接する要素にアクセスできるようになります。ただし、int[][1] のような 2 次元配列では、各要素は int の部分配列へのポインタとして格納されます。 int** がこの 2 次元配列を指している場合、各部分配列のサイズがわからないため、意味のあるポインター演算を実行できません。
代わりに、次の次元間の関係を維持します。配列が減衰すると、C は 2 次元配列をポインターの配列へのポインターに減衰します。つまり、int[][1] は int (*[])[1] に減衰します。
この動作は、ポインターと非ポインターを含む混合配列を含む、あらゆる次元の配列に適用されます。たとえば、int[] は int に減衰しますが、int[][] には減衰しませんが、int[] は int に減衰します。
C で配列を操作する場合、配列型とポインター型の間の互換性を確保するには、この型減衰メカニズムを理解することが重要です。
以上がC の int[] と int[][] で配列の減衰が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。