Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C / C ++ポインターパズル?


サイズが4バイトの整数変数が1つあり、サイズが8バイトの別のポインター変数があるとします。では、次の出力はどうなるでしょうか?

#include<iostream>
using namespace std;
main() {
   int a[4][5][6];
   int x = 0;
   int* a1 = &x;
   int** a2 = &a1;
   int*** a3 = &a2;
   cout << sizeof(a) << " " << sizeof(a1) << " " << sizeof(a2) << " " << sizeof(a3) << endl;
   cout << (char*)(&a1 + 1) - (char*)&a1 << " ";
   cout << (char*)(&a2 + 1) - (char*)&a2 << " ";
   cout << (char*)(&a3 + 1) - (char*)&a3 << " ";
   cout << (char*)(&a + 1) - (char*)&a << endl;
   cout << (char*)(a1 + 1) - (char*)a1 << " ";
   cout << (char*)(a2 + 1) - (char*)a2 << " ";
   cout << (char*)(a3 + 1) - (char*)a3 << " ";
   cout << (char*)(a + 1) - (char*)a << endl;
   cout << (char*)(&a[0][0][0] + 1) - (char*)&a[0][0][0] << " ";
   cout << (char*)(&a[0][0] + 1) - (char*)&a[0][0] << " ";
   cout << (char*)(&a[0] + 1) - (char*)&a[0] << " ";
   cout << (char*)(&a + 1) - (char*)&a << endl;
   cout << (a[0][0][0] + 1) - a[0][0][0] << " ";
   cout << (char*)(a[0][0] + 1) - (char*)a[0][0] << " ";
   cout << (char*)(a[0] + 1) - (char*)a[0] << " ";
   cout << (char*)(a + 1) - (char*)a;
}

この質問を解決するために、以下のようないくつかの重要なポイントに従うことができます-

  • 整数サイズは4バイト(32ビット)で、ポインターサイズは8バイトです。ポインタで1を追加すると、次のイミディエートタイプを指します。

  • &a1はint **型、&a2はint ***型、&a3はint****型です。ここではすべてがポインタを指しています。 1を追加すると、8バイトが追加されます。

  • a [0] [0] [0]は整数、&a [0] [0][0]はint*、a [0][0]はint*、&a[0][0]はint型です。 (*)[6]など。したがって、&aはint(*)[4][5][6]型です。

出力

480 8 8 8
8 8 8 480
4 8 8 120
4 24 120 480
1 4 24 120

  1. C / C ++のmemcpy()

    この記事では、C ++ STLでのmemcpy()関数の動作、構文、および例について説明します。 memcpy()とは何ですか? memcpy()関数は、C ++ STLに組み込まれている関数であり、ヘッダーファイルで定義されています。 memcpy()関数は、メモリのブロックをコピーするために使用されます。この関数は、あるメモリ位置から別のメモリ位置に値の数をコピーするために使用されます。 関数の結果は、データのバイナリコピーです。この関数は、終了ソースまたは終了ヌル文字をチェックせず、ソースからnumバイトをコピーするだけです。 例 void memcpy( void* destin

  2. C / C ++のAAツリー?

    コンピュータサイエンスのAAツリーは、順序付けられたデータを効率的に保存および取得するために実装されたバランスの取れたツリーの形式として定義されます。 AAツリーは、エントリの効率的な追加と削除をサポートするバイナリ検索ツリーの形式である赤黒ツリーのバリエーションとして扱われます。赤黒木とは対照的に、AAツリーの赤いノードは、左のサブチャイルドではなく、右のサブチャイルドとしてのみ追加できます。この操作の結果、2-3-4ツリーではなく2-3ツリーのシミュレーションが行われるため、メンテナンス操作が簡素化されます。赤黒木のメンテナンスアルゴリズムでは、ツリーのバランスを適切にとるために、7つの異