ポインタはアドレスを保持し、そのアドレス値を使って
アドレスの指す値へアクセスできる機能でした。
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番地の値を指す。と言う事になります。
この関係を図で示すとこうなります。