ホームページ > バックエンド開発 > C++ > なぜ `int[]` は `int*` に分解されるのに、 `int[][]` には分解されないのでしょうか?

なぜ `int[]` は `int*` に分解されるのに、 `int[][]` には分解されないのでしょうか?

Mary-Kate Olsen
リリース: 2024-10-28 15:38:02
オリジナル
724 人が閲覧しました

Why does `int[]` decay into `int*` but not `int[][]`?

なぜ int[] は int* に減衰するが、 int[][] には減衰しないのでしょうか?

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

* に減衰する理由を説明しています。理由: なぜ int

[][]

ではないのか?

2 次元配列がポインタへのポインタに崩壊しない理由は、ポインタ演算の実行が困難になるためです。 2 次元配列では、各要素はメモリの連続ブロック内の特定のオフセットに格納されます。要素にアクセスするには、コンパイラーは両方の次元のサイズを知る必要があります。これが int** に崩壊すると、この重要な情報が失われ、ポインターの演算が不可能になります。

以上がなぜ `int[]` は `int*` に分解されるのに、 `int[][]` には分解されないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート