■H28春、H25春
問20 メインプログラムを実行した後,メインプログラムの変数X,Yの値は幾つになるか。ここで,仮引数Xは値呼出し(call by value),仮引数yは参照呼出し(call byreference)であるとする。
【正解】イ
少し補足します。
①仮引数Xは値呼出し(call by value)
main関数での「値」を呼び出します。add関数実行では、main関数とは違うアドレスに記録します。
よってmain関数のXの値が変化しません
②仮引数yは参照呼出し(call byreference)
main関数でのyの値が入った「アドレス」を呼び出します。add関数実行により、main関数でのYの値を書き換えるので、Yの値が変化します。
#include <stdio.h> //add関数 void add(int X, int *Y) { //"Y"は参照呼び出し(ポインタ)で渡されるため // 値を参照する場合や、値を代入する場合は"*Y"を使用 X = X+*Y; //"X"に"Y"の値を加えて"X"に代入 *Y = X+*Y; //"X"に"Y"の値を加えて"Y"に代入 } //main関数 void main(){ int X, Y; //"X","Y"をint型変数で定義 X = 2; Y = 2; //add関数の実行 add(X,&Y); //add関数実行後の"X","Y"の値を表示 printf("add(X,Y)はX=%d,Y=%dです\n", X, Y); } |
"X"は値呼び出しで渡されるため、add関数実行により値が変化しない
"Y"は参照呼び出しで渡されるため、add関数実行により値が変化する
具体的には、X=2+2=4、Y=4+2=6
■メモ
メモリ上のアドレスと、その値
http://sc.seeeko.com/archives/5377814.html
■ポインタで変数を宣言する意味
ポインタ変数はデータを格納するアドレスそのものを変数として定義します。「char *a」と宣言すると変数aにはアドレスが格納されます。このアドレスを他の関数にもアドレス情報として渡せばデータそのものをコピーしたりする必要がありません。
一方、「char a」と宣言すると変数aはデータの中身を示します。データの中身は他の関数に渡す場合、このままだと渡す先の変数に同じデータがコピーされるため、メモリを余分に使うことになります。
もちろん、マスターのデータを変えたくないのであれば、このままでもよいと思います。
コメント