値呼出しと参照呼出し(call by value / call by reference)
引数の渡し方。値呼出しは写しを渡すので呼び出し元は変わらず、参照呼出しは置き場所を渡すので変わる。
もう少し詳しい説明
手続き(関数)を呼び出すとき、引数をどう渡すかには方式があります。試験に出るのは2つです。
| 何を渡すか | 呼び出し元は | |
|---|---|---|
| 値呼出し | 値の写し | 変わらない |
| 参照呼出し | 値の置き場所 | 変わる |
値呼出し
値をコピーして渡します。
呼ばれた側が受け取るのは写しです。写しを書き換えても、もとの変数には何も起きません。
手続き ふやす(x)
x ← x + 1
a ← 5
ふやす(a)
// a は 5 のまま
手続きの中の x は、a とは別の入れ物です。x を6にしても、a は5のままです。
呼び出し元を壊さないのが利点です。渡した変数が勝手に変わらないので、読むときに安心できます。
参照呼出し
値の置き場所を渡します。
呼ばれた側は、呼び出し元と同じ場所を見ます。そこを書き換えれば、もとの変数が変わります。
手続き ふやす(参照 x)
x ← x + 1
a ← 5
ふやす(a)
// a は 6 になる
大きなデータを渡すときに有利です。値呼出しでは、1万件の配列を渡すたびに1万件をコピーします。参照呼出しなら、置き場所を1つ渡すだけで済みます。
代わりに、呼ばれた側が呼び出し元を書き換えられます。思わぬところで値が変わる原因になります。
使い分け
| 向く場面 | 気をつけること | |
|---|---|---|
| 値呼出し | 小さな値。書き換えたくないもの | 大きなデータはコピーの手間がかかる |
| 参照呼出し | 大きなデータ。結果を返したいもの | 意図せず書き換えてしまう |
結果を複数返したいときに参照呼出しが使われることがあります。戻り値は1つしか返せない言語でも、参照で渡した引数に書き込めば、いくつでも返せます。
試験での落とし穴
「参照の値渡し」
JavaやPythonのような言語では、配列やオブジェクトを渡すと、中身が書き換わります。これを参照呼出しだと説明する資料がありますが、正確には違います。
渡しているのは「置き場所を指す値」の写しです。
| 手続きの中ですること | もとの変数は |
|---|---|
| 配列の中身を書き換える | 変わる(同じ配列を指しているため) |
| 引数に別の配列を代入する | 変わらない(写しの指し先が変わるだけ) |
中身は変えられるが、指す先そのものは変えられません。 ここが参照呼出しとの違いです。
試験の擬似言語では、ここまで踏み込んだ出題は多くありません。問題文に「値呼出し」「参照呼出し」と書いてあれば、その定義どおりに考えれば足ります。
名前呼出し
まれに選択肢に出ます。引数を、値でも場所でもなく「式のまま」渡し、使うたびに評価する方式です。
| 方式 | 渡すもの |
|---|---|
| 値呼出し | 値の写し |
| 参照呼出し | 置き場所 |
| 名前呼出し | 式そのもの |
実際に使う言語はほとんどありません。名前と「式のまま渡す」だけ知っておけば足ります。
試験ではこう出る
科目A(旧・午前)では、手続きの中で引数を書き換えたとき、呼び出し元がどうなるかがそのまま問われます。値呼出しなら変わらない、参照呼出しなら変わる、です。
短いプログラムを読んで、実行後の値を答える形も出ます。どちらの方式かを問題文で確かめてから追ってください。
大きなデータでは参照呼出しが有利という点も出ます。コピーの手間がないためです。
応用情報では、副作用の文脈で出ます。参照呼出しは、呼び出し元の状態を変えてしまうため、どこで値が変わったのか追いにくくなります。
関連する用語
- プログラム言語
- どちらの方式を使うかは、言語によって決まっている
- プログラムの性質
- 再入可能など、呼び出しにまつわる性質
- 再帰
- 自分を呼び出す。呼ぶたびに引数の置き場所が増える
- スタック
- 呼び出しのたびに引数や戻り先が積まれる場所
ミニクイズ
手続きの引数の渡し方として値呼出し(call by value)を用いた場合、手続きの中で引数の値を書き換えると、呼び出し元の変数はどうなるか。
正解は 1番:変わらない
値呼出しでは、呼び出すときに実引数の値を写して渡します。手続きの中にあるのは写しなので、それを書き換えても、もとの変数には影響しません。呼び出しが終わっても書き戻されることはありません。もとの変数まで変わるのは参照呼出しで、こちらは値ではなく置き場所そのものを渡すため、手続きの中から同じ場所を書き換えることになります。どの方式を使うかは言語ごとに決まっていますが、値呼出しを使ったと問題文で指定されている以上、答えは一つに決まります。
この分野をまとめて解く → アルゴリズムとプログラミングのミニテスト(全44問)
最終更新:2026-10-20