問題CPP00130の解答例と解説 C++ Lv.2

参照渡し abs(15分)



<解答例 1>
F11キーでフルスクリーンモード、Escキーで元に戻ります。

引数の a の値を変えてあげればいいね。


<解答例 2>
F11キーでフルスクリーンモード、Escキーで元に戻ります。

標準ライブラリのabs関数を使っても、もちろんいいよ。


今回の問題のAbs関数は本来だったら、わざわざ参照渡し参照引数を使わなくても、戻り値で返してあげればいいよ。今回は、練習のために、こういう問題を用意したよ。




参照引数が良くわかない人のために参照引数について解説するよ。まずは参照引数ではなく、値渡しの引数の関数の場合を考えてみよう。
F11キーでフルスクリーンモード、Escキーで元に戻ります。

参照引数を理解するためには、メモリの中をイメージすると良いよ。この例ではまず、Function 関数が呼ばれるけど、その時のメモリの中のイメージは、下図のFig.1だよ。Function 関数の中では、int型の変数 x が定義されているから、この分のメモリがスタックメモリ上で確保されるんだ。int 型の変数が使用するメモリ量は 32bit CPUだと4byteだよ。Fig.1 は、上のソースコードの10行目が実行される直前のメモリだよ。
次に10行目でAbs関数が呼ばれて、1行目から5行目を実行しているときのメモリイメージは Fig.2 のようになるよ。プログラムは、関数が呼ばれると、その関数で使用する変数のメモリを確保するんだ。Abs関数の場合、関数の中で定義されている変数は一つもないから、メモリを確保していないように見えるけど、引数も変数の1つなので、ここでint 型分のメモリ(32bit CPUなら 4byte)が確保されるよ。これで合計8byteが使われていることになるよ。そして、int a と int x は異なるメモリ上のものだから、どちらかを変更しても、もう一方には影響しないよ。

そしてAbs関数の呼び出しが終わって処理が11行目に行ったときのメモリイメージが Fig.3 だよ。



次に、参照引数のときを見てみるよ。


10行目のAbs関数が呼ばれるまでは同じだよ。
Abs関数が呼ばれたとき、スタックメモリ上では、Abs関数で使用する変数のメモリを確保しようとするけど、引数 a は参照引数なので、これは Function 関数のスタックメモリ上にある int x のメモリを参照(Refer)しているんだ。ここでは int a の値の分のメモリは消費されないよ。ここでint a の値を変更したら、int x も変わるよ。
そして、Abs関数の呼び出しが終わったときのメモリイメージは値渡し引数の時も参照引数の時も同じだよ。


どういうときに参照渡しを使うかというと、1つは関数から複数の値を返したいときだよ。戻り値だと1つだけだからね。これは次の問題をやってみれば、どういうことかわかるよ。そのほかは、またあとで説明するよ。
 参照渡し swap(15分)




初めての方へ:このページは、このサイトで用意しているプログラミング問題の解答と解説のページです。このサイトではブラウザ上からプログラミングができます。会員登録(無料)して、プログラミングしてみませんか?
新規登録



ログイン
メールアドレス:

パスワード:



パスワード紛失

新規登録