多次元配列が単次元配列とは異なる方法でポインタに変化するのはなぜですか?

DDD
リリース: 2024-10-26 08:24:03
オリジナル
562 人が閲覧しました

 Why Do Multidimensional Arrays Decay to Pointers Differently Than Single-Dimensional Arrays?

次元に応じて配列がポインターに異なる形で減衰する理由

はじめに

配列とポインターを扱う場合、型の減衰がどのように発生するかを理解することが重要です。 2 次元配列は double ポインターに分解されると予想されるかもしれませんが、常にそうとは限りません。なぜこれが起こるのかを掘り下げ、動作の違いを調べてみましょう。

1 次元配列の減衰

テスト ケースが示すように、1 次元配列は実際に単一のポインターに減衰します。

<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
ログイン後にコピー

これは、ポインター演算が単一のポインターで実行できるためです。

多次元配列の減衰

ただし、2 次元配列は二重ポインターに減衰しません。 :

<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
ログイン後にコピー

その理由は、ダブル ポインターには配列の次元に関する追加情報が必要であるためです。たとえば、int[5][4] の場合、コンパイラーは各「内部」配列の長さが 4 であることを認識します。 int (*)[4] にキャストするとこの情報が保持され、ポインター演算が可能になります。

ただし、int ** にキャストすると、このディメンション情報が失われます。これは単なるポインタへのポインタになり、意味のあるポインタ演算を実行するには十分ではありません。

違いを理解する

次の点を考慮してください:

<code class="cpp">char *tmp = (char *)p           // Work in units of bytes (char)
          + i * sizeof(int[4])  // Offset for outer dimension (int[4] is a type)
          + j * sizeof(int);    // Offset for inner dimension
int a = *(int *)tmp;            // Back to the contained type, and dereference</code>
ログイン後にコピー

このコード配列アクセスを手動で実行し、コンパイラがディメンション情報に依存していることを示しています。 int** はこの情報を提供しないため、ポインター演算には適していません。

結論

1 次元配列は単一のポインターに減衰しますが、多次元配列はダブル ポインターに減衰しません。必要な寸法情報が欠如しているためです。この動作により、単次元ポインターを使用した意味のあるポインター演算が引き続き可能になります。

以上が多次元配列が単次元配列とは異なる方法でポインタに変化するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!