1. ホーム
  2. c

ポインタからポインタへのポインタと通常のポインタとの比較

2023-09-22 06:53:35

質問

ポインタの目的は、特定の変数のアドレスを保存することです。その場合、次のコードのメモリ構造は次のようになります。

int a = 5;
int *b = &a;

メモリアドレス ..................値

a ... 0x000002 ................... 5

b ...... 0x000010 ....... 5

なるほど、結構です。では、今度はポインタ*bのアドレスを保存したいと仮定します。そうすると、一般にダブルポインタ **c を次のように定義します。

int a = 5;
int *b = &a;
int **c = &b;

すると、メモリ構造は次のようになります。

......メモリアドレス ......値

a ... 0x000002 ................... 5

b ...... 0x000010 ....... 5

c ... 0x000020 ................... 0x000010

つまり、**cは*bのアドレスを参照しています。

さて、私の疑問は、なぜこのようなコードになるのか、ということです。

int a = 5;
int *b = &a;
int *c = &b;

警告を発生させるか?

ポインタの目的が単にメモリアドレスを保存することであれば、保存しようとするアドレスが変数、ポインタ、ダブルポインタなどを指していれば階層はないはずなので、以下のようなコードは有効だと思います。

int a = 5;
int *b = &a;
int *c = &b;
int *d = &c;
int *e = &d;
int *f = &e;

どのように解決するのですか?

int a = 5;
int *b = &a;   
int *c = &b;

警告が表示されるのは &b は型が int ** 型の変数を初期化しようとすると int * . これら2つの型の間には暗黙の変換がないため、警告が発生します。

もっと長い例を考えてみましょう。 f を参照しようとすると、コンパイラは int を与えるだけで、それ以上参照できないポインタです。

また、多くのシステムで intint* は同じサイズではありません(例えば、ポインタは64ビット長で int は32ビット長である)。もし,非参照の f を参照し int を取得すると、値の半分を失い、さらにそれを有効なポインタにキャストすることもできません。