ポインター
5月も暮れ。
こんな時期の大学2年生はこんなことを思うのではないだろうか。
ポインターがいまいち分かんね〜
(弊学1類の場合)
引数にポインターで渡すと、
なんで変数の有効範囲を超えて、中身が変わるんだ????
夜道に一人で歩いていたらふと
そんな悩める子羊たちにとっておきの例えを思いついたのだ!!
まず、ポインターはアドレスを入れる変数だから、住所として例えて
そんで、そのアドレスにある変数の値を人として例える。
例えば
住所=東京都調布市1-5-1
人=アンディくん
だとして、下のプログラムを考えて見よう。
>||
void a(int* x){*x+=1;}
void b(int x){x+=1};
int main(){
int x=0;
a(&x); printf("%d¥n",x);
b(x); printf("%d¥n",x);
}
||<
↑の例のように、関数っていうのは、引数をもらうけど、
引数でもらった値っていうのは、中身がおんなじ別のもので、言い換えればクローンだ。
b(int)関数のxは、アンディくんのクローン人間を引数でもらってるんだね。
それで、関数内でアンディくんクローンをボコボコにしても、本物のアンディくんはなんもダメージ受けない。
それに対し、a(int*)関数は、アンディくんの住所を引数でもらっている。引数だからクローンをもらっているけど、住所だから、その「東京都調布市1-5-1」に行けば、本物のアンディくんがいるから、そいつぶん殴れば、本物をボコボコにできるよね。
こんな感じで、ポインターの中身をいじるっていうのは、その住所を頼りに、本物に会いに行って、いじっているんだね。それに対し、中身を引数でもらうとそのクローンを変化させているだけだから、本物に変化が効かないんだね。
こんな感じのたとえで、ポインターを理解してくれると嬉しいな。