「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

「値呼び出し」と「参照呼び出し」の違い

スポンサーリンク

予備知識


用語意味
変数プログラミング言語における「値を入れておく箱」
関数処理のまとまり。何かを入れると何かを計算して何かを返してくれるやつ
引数(ヒキスウ)プログラムや関数に渡す値

それぞれの用語の意味


用語意味
値呼び出し(アタイヨビダシ)関数に変数を(引数として)渡すときの「渡し方の種類」のひとつ。渡す変数をコピーして、コピーした変数を「これを使ってね」と渡すやり方
参照呼び出し(サンショウヨビダシ)関数に変数を(引数として)渡すときの「渡し方の種類」のひとつ。変数の置いてある場所が書かれた紙を渡して「ここにある変数を使ってね」と伝えるやり方

似ているところ


どちらも引数の渡し方に関する用語です。


「値呼び出し」と「参照呼び出し」の違い1

違うところ


渡し方が違います。

関数に変数を引数として渡すときの渡し方は2種類あります。
それは

1.元の変数をコピーして渡すやり方
2.元の変数の置いてある場所を書いた紙を渡すやり方


の2つです。


「値呼び出し」と「参照呼び出し」の違い2

この2つの渡し方のうち

1.元の変数をコピーして渡すやり方

が値呼び出しです。


「値呼び出し」と「参照呼び出し」の違い3

もう一方の

2.元の変数の置いてある場所を書いた紙を渡すやり方

が参照呼び出しです。


「値呼び出し」と「参照呼び出し」の違い4

この渡し方の違いに伴い

値呼び出し:変数の中身を書き換えても呼び出し元には影響しない
参照呼び出し:変数の中身を書き換えると呼び出し元の変数の中身も書き変わる


といった違いも生じます。

例えば、そうですね。

ここにピヨ太関数が ありました。


「値呼び出し」と「参照呼び出し」の違い5

ピヨ太関数は、変数「ミカン箱」に値「ミカン1つ」を入れました。


「値呼び出し」と「参照呼び出し」の違い6

ピヨ太関数は、値「ミカン1つ」が入った変数「ミカン箱」をピヨ子関数に引数として渡すことにしました。


「値呼び出し」と「参照呼び出し」の違い7

値呼び出しの場合、ピヨ太関数は変数「ミカン箱」をコピーします。


「値呼び出し」と「参照呼び出し」の違い8

※ピヨの左手ピヨの右手(ピヨピヨフェイク)の詳細が気になる方は、用語「ピヨの左手ピヨの右手」の説明を ご覧ください。

次に、コピーした変数「ミカン箱」を「これを使ってね」とピヨ子関数に渡します。


「値呼び出し」と「参照呼び出し」の違い9

これが値呼び出しです。
変数「ミカン箱」は2つに分身します。


「値呼び出し」と「参照呼び出し」の違い10

おっと!大変です。
ピヨ子関数が変数「ミカン箱」の中にあるミカンを食べてしまいました。


「値呼び出し」と「参照呼び出し」の違い11

でも大丈夫です。

ピヨ子関数に渡したのはコピーした変数「ミカン箱」です。
ピヨ太関数の手元にある変数「ミカン箱」の中身のミカンは残っています。


「値呼び出し」と「参照呼び出し」の違い12

値呼び出しでは

呼び出した関数内で変数の値を書き換えても、呼び出し元の変数は影響を受けない

のです。

参照呼び出しの場合は、ピヨ太関数はピヨ子関数に「変数『ミカン箱』の置いてある場所」を書いた紙を渡します。
「変数『ミカン箱』を使いたければ、この紙を頼りに探して、見つかった変数『ミカン箱』を使ってね!」なのです。


「値呼び出し」と「参照呼び出し」の違い13

値呼び出しのときと違って、参照呼び出しでは、変数「ミカン箱」は分身しません。
1つだけです。


「値呼び出し」と「参照呼び出し」の違い14

おっと!大変です。
ピヨ子関数が「変数『ミカン箱』の置いてある場所」を書いた紙を元にして変数「ミカン箱」を見つけ、変数「ミカン箱」の中にあるミカンを食べてしまいました。


「値呼び出し」と「参照呼び出し」の違い15

ピヨ子関数がミカンを食べた変数「ミカン箱」は、ピヨ太関数の手元にある変数「ミカン箱」と同じものです。
ピヨ太関数の手元にある変数「ミカン箱」の中にあるミカンが、なくなってしまいました。


「値呼び出し」と「参照呼び出し」の違い16

参照呼び出しでは

呼び出した関数内で変数の値を書き換えると、呼び出し元の変数の中身も書き変わる

のです。

これが値呼び出しと参照呼び出しの主な違いです。

他にも、メモリ領域の確保がどーたらこーたらといった違いとかもありますけどね。
一番、意識しておくべき違いは

値呼び出し:変数の中身を書き換えても呼び出し元には影響しない
参照呼び出し:変数の中身を書き換えると呼び出し元の変数の中身も書き変わる


です。


個人的な使い分け


関数に対して情報を与えたいだけの場合は値呼び出しを使います。
呼び出し元から呼び出し先の関数に対する一方通行の場合です。


「値呼び出し」と「参照呼び出し」の違い17

関数内での変更を呼び出し元にも反映したい場合は参照呼び出しを使います。
呼び出し元と呼び出し先の関数で双方向のやり取りをしたい場合です。


「値呼び出し」と「参照呼び出し」の違い18

実際には、あれやこれやの理由で、関数に対して情報を与えたいだけの場合でも参照呼び出しを使うことはありますけどね。
基本は上記のとおりです。


スポンサーリンク
書籍画像028
書籍画像074


書籍画像
わわわ説明術コラム
宣伝だよ
エンジニア育成現場の「失敗」集めてみた。 42の失敗事例で学ぶマネジメントのうまい進めかた
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践