ホームページ  >  記事  >  バックエンド開発  >  C/C++ ポインター パズルですか?

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

WBOY
WBOY転載
2023-09-21 23:33:031200ブラウズ

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

サイズが 4 バイトの整数変数と、サイズが 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 *、[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

以上がC/C++ ポインター パズルですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。