C言語 ポインタのポインタとは?(ダブルポインタ)

ポインタはアドレスを保持し、そのアドレス値を使って
アドレスの指す値へアクセスできる機能でした。

int a = 5000;
int* p;

p = &a;

printf("変数a=%d\n", a);
printf("ポインタpが指す値=%d\n", *p);

変数aには5000と言う値が入っていて、
ポインタ変数pにはaのアドレスを入れました。

仮に変数aのアドレス値が700番地だったとしたら、
ポインタ変数を使って700番地にアクセスできます。
この関係を図で示すとこうなります。


ダブルポインタは、2段階のアドレスを追った値を指す事になります。

int a = 9000;
int* p;
int** pp;

p = &a;

printf("変数a=%d\n", a);
printf("ポインタpが指す値=%d\n", *p);

pp = &p;

printf("ポインタのポインタppが指す値=%d\n", *pp);

変数aのアドレスが仮に5000番地だったとすると、
変数aの値は9000が格納されている事になります。

ポインタ変数pを使って5000番地の値(変数aの値)にアクセスできます。
これは通常のポインタ機能です。

ダブルポインタはさらにもうひとつアドレスを追いかけます。
ポインタ変数pのアドレス値が仮に700番地だったとして、
ダブルポインタ変数ppに700を代入して
*pp と言う記述をすると、*ppが指す値は、
2段階のアドレス値を追った番地の値を指す事になります。

内部的な動作は次のようになります。

まずはppの値が700なので、700番地の値を見に行きます。
そして、700番地の値が5000でした。
この5000と言う数値を番地(アドレス)とみなして、
さらに5000番地を見に行き、
その5000番地の値を指す。と言う事になります。

この関係を図で示すとこうなります。