「分かりそう」で「分からない」でも「分かった」気になれる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

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


スポンサーリンク
書籍画像008
書籍画像039


書籍画像
わわわ説明術コラム
宣伝だよ
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
7日間でハッキングをはじめる本 TryHackMeを使って身体で覚える攻撃手法と脆弱性
わかばちゃんとつくって、壊して、直して学ぶ NewSQL入門