#include <stdio.h>
int main(void){
int a = 0;
int b = 0;
int *p = &a;
int **pp = &p;
int ***ppp = &pp;
*p += 10; // a += 10と同じ(+=は「○○ずつ変える」という意味がある。1ずつなら++のみでいい。)
**pp += 20; // a += 20と同じ
***ppp += 30; // a += 30と同じ
a += 40; //ここまで計算するとaには100入ってるので他のポインタ変数も変数aの値(100)と同じ値になる。
printf("*p = %d **pp = %d ***ppp = %d a = %d\n",*p,**pp,***ppp,a);
*p += 20; // a += 20と同じ
**pp += 30; // a += 30と同じ。ここまでの計算でaは150に。
p = &b; // *p が記憶する変数のアドレスを a → bへ変更(bの初期値は0なのでまた0から始まる。今度は「int」がついてないのでアドレス代入時はポインタ変数にアスタリスクは付けない。)
*p += 10; // b += 10と同じ
**pp += 20; // b += 20と同じ
***ppp += 30; // b += 30と同じ
b += 40;
printf("*p = %d **pp = %d ***ppp = %d a = %d b = %d\n",*p,**pp,***ppp,a,b);
}
実行結果は実際にこのコードをコピペして確かめてね。
もうポインタはこうやって考えたほうがいいかも。
まず今回はポインタのポインタのポインタだから
***ppp→**pp→*p→&a(通常変数aのアドレス)
***pppは**ppを指していて
その**ppは*pを指していて
さらにその*pは通常変数aのアドレスを指しているってことだ。
つまり、*pが通常変数aのアドレスを記憶しているなら
**ppや***pppも通常変数aと同じように使えるっていうことだな。
まぁ難しい事は考えず
*p や **pp や *ppp などのポインタ変数は
まずは通常変数と同じものとして考えるほうがいいかもな。
当然だが、*pの記憶しているアドレスをa→bに変えると
当然、*pも変数bとまったく同じものとして扱われるってこと。
ちなみにだが、
int a = 0;(これが通常変数)
int *p = &a; (ポインタ変数。*pはaのアドレスなのでaと同じように扱える)
a += 100;
この場合、ポインタ変数を100ずつ変えてないのに
printfでポインタ変数の値を表示すると
通常変数aと同じく「100」と表示されるのも
*pは通常変数aのアドレスを記憶しているため、
当然、*pはaの値と同じになる。
↓
*p→&a→a = 100(aのアドレス)