値呼出しと参照呼出し(call by value / call by reference)

分類
テクノロジ系 アルゴリズムとプログラミング
出る試験
基本情報応用情報
重要度
★★★★☆

引数の渡し方。値呼出しは写しを渡すので呼び出し元は変わらず、参照呼出しは置き場所を渡すので変わる。

もう少し詳しい説明

手続き(関数)を呼び出すとき、引数をどう渡すかには方式があります。試験に出るのは2つです。

何を渡すか呼び出し元は
値呼出し値の写し変わらない
参照呼出し値の置き場所変わる
値呼出し呼び出し元 a = 5写しを渡す → 手続きの x は別の入れ物参照呼出し呼び出し元 a = 5置き場所を渡す → 手続きも同じ入れ物を見る
値呼出しでは、手続きの中にあるのは写しです。書き換えても、もとの変数には何も起きません。参照呼出しでは同じ場所を見ているので、書き換えるともとの変数が変わります。大きなデータでは、写しを作らないぶん参照呼出しが有利になります。

値呼出し

値をコピーして渡します。

呼ばれた側が受け取るのは写しです。写しを書き換えても、もとの変数には何も起きません。

手続き ふやす(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