C における配列型の崩壊
C では、配列は特定のコンテキストで使用されると本質的にポインターに崩壊します。ただし、この減衰動作は、一次元配列と多次元配列で異なります。
単次元配列の減衰: int[] から int*
単次元配列の場合ポインターを必要とするコンテキストで使用されると、事実上、その最初の要素へのポインターに分解されます。たとえば、次のコードについて考えてみましょう。
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
これは、int[] 型の減衰により int* 型が生成されるため、true を返します。
多次元配列の減衰: int [][1] to int
対照的に、多次元配列が同様のコンテキストで使用される場合、それはポインターへのポインターに減衰しません。代わりに、それ自体が配列である最初の要素へのポインターに変化します。例:
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
int[][1] 型の減衰により int** 型ではなく int* 型が生成されるため、これは false を返します。
ポインタ配列の減衰: int*[] から int
興味深いことに、ポインタの配列が作成されると、それはポインタへのポインタに減衰します。これは、次のコードから明らかです。
<code class="cpp">std::is_same<int**, std::decay<int*[]>::type>::value; // true</code>
この観察は、最後の次元が配列である限り、ポインターの配列内のすべての型に当てはまります。たとえば、int***[] は、ポインタへのポインタへのポインタである int*** (または int****) に減衰します。
減衰の違いの理由
この減衰動作の不一致の理由は、ポインター演算の概念にあります。 1 次元配列はポインターの動作と自然に一致するため、効率的なポインター算術演算が可能になります。ただし、多次元配列の場合は、各次元が異なるレベルの間接化を表すため、同じことは当てはまりません。減衰する多次元配列に対してポインタ演算を試みると、無効なメモリ アクセスや予測不可能な動作が発生します。
以上がC における一次元配列と多次元配列の減衰はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。