豊かになりたい

意識高く生きたいけど恋も遊びもゆったりもしたい大学生

ポインター

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」に行けば、本物のアンディくんがいるから、そいつぶん殴れば、本物をボコボコにできるよね。

 

こんな感じで、ポインターの中身をいじるっていうのは、その住所を頼りに、本物に会いに行って、いじっているんだね。それに対し、中身を引数でもらうとそのクローンを変化させているだけだから、本物に変化が効かないんだね。

 

こんな感じのたとえで、ポインターを理解してくれると嬉しいな。