パソコンの電源を入れると,ほのちゃん(もうすぐ3才)が「エンター,エンター」と叫びながら走って来て,ログイン画面でエンターキーを押す。デスクトップにアイコンが表示されるとほのちゃんはご満悦。本人によるとこの瞬間,ほのちゃんは「エンター小僧」に変身するらしい。(女の子なのだが…)
10月6日 こうしろうはかずの「マインドストームで何か作ろうよ」という声を振り切って,C言語の勉強を進める。今日のテーマはcall by value(値渡し)とcall by reference(参照渡し)である。
日経ソフトウエア連載の『ゼロから学ぶC/C++言語』第4回の解説に従って,サンプルプログラムを入力し,コンパイル&テストを行う。
変数の入れ換え(失敗例)
#include<stdio.h>
void swap(int x,int y)
{
int z;
z = x;
x = y;
y = z;
}
int main()
{
int a,b;
a = 3;
b = 10;
swap(a,b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
まずは失敗例である。main関数から,変数a,bをswap(入れ替え)関数に渡す。swap関数側ではzという変数を仮の保存場所として使いx,yつまりaとbの値を入れ替えようとする。しかし,printfで表示させた結果はa = 3,b = 10のままである。
「なーんでか?」とこうしろうに訊ねるが,答えが的を射ていない。「今度は,次のサンプル・プログラム入力してごらん」と下記の成功例を入力,実行する。
変数の入れ換えB(成功例)
#include<stdio.h>
void swap(int *x,int *y)
{
int z;
z = *x;
*x = *y;
*y = z;
}
int main()
{
int a,b;
a = 3;
b = 10;
swap(&a,&b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
今度はaとbの値が入れ替わった。この例では,main関数から変数のアドレスをswap関数に渡し,swap関数側ではポインタ変数で引数を受けとり,アドレスの中味を入れ替えている。ポインタを使い,参照渡しで変数のアドレスを渡すことにより,ローカルな変数(定義した関数内でしか扱えない変数)をその関数の外部でも扱えるようにすることができる。
「こうしろう,失敗例(値渡し)ではswap関数の中にaとbのコピーができるわけや。それを入れ替えても,main関数のaとbには何も影響がないんだ」,「逆にaとbの値を渡して,計算結果を返してもらうような関数だったら,値渡しでいいわけや。」
試験前の勉強明けのような表情をしているこうしろうに『やっぱ,むずかしいわな。メモリの内部なんて目に見えないものを想像しなくっちゃいけないんだから』などと思うが,わかりたいと思い続ければそのうち,わかるのだろう。