広告 プログラム

参照渡しとは

参照渡し

関数への引数の渡し方には「値渡し」と「参照渡し」があります。参照渡し(英:call by reference)とは、変数のメモリ番地(メモリ上の位置)を渡す方法です。

変数のメモリ番地を渡しているため、関数内で引数の値を変更すると、呼び出し元の変数も変更されてしまいます。

チェック

  • 値渡し:変数の値(実体)をコピーして渡す方法
  • 参照渡し:変数のメモリ番地を渡す方法

参照渡しの流れ

例えば、次のような「関数A」があるとします。「関数A」には「引数」があり、「関数A」を呼び出すときは引数を指定します。

関数の呼び出し

それでは、上記の関数を例に"参照渡し"の流れを説明していきます。

変数の実体はメモリ上で管理されている

呼び出し元「変数A」の実体はメモリ上で管理されています。

変数の実体

"参照渡し"で関数を呼び出すと、実体のメモリ番地がコピーされる

この「変数A」を"参照渡し"で「関数A」に渡すと、「変数A」のメモリ番地(メモリ上の位置)を「関数A」に渡します。(メモリ上はメモリ番地がコピーされ「関数A」の引数はコピーされたメモリ番地を参照する)

参照渡しのイメージ例

結果、呼び出し元の「変数A」と呼び出された関数の「引数A」は同じ実体を参照しています。

そのため、関数内で「引数A」の値を変更すると、呼び出し元の「変数A」の値も変わります。

参照の値渡し

Javaなどの多くのプログラミング言語は、"参照の値渡し"により参照渡しに相当する機能を実現しています。

参照の値渡し?

例えば、Javaではオブジェクトへの参照を参照型の値として管理しています。

参照型のイメージは次のとおりです。オブジェクトの実体とは別にメモリ番地(メモリ上の位置)が作られ、そのメモリ番地を参照しています。

アドレスを参照

 

この状態で"値渡し"をすると次のように、メモリ番地を"値渡し"で渡すことになります。

参照の値渡し

結果、「呼び出し元変数」と「関数の引数」は同じ実体のメモリ番地を参照しています。この動きを"参照の値渡し"といいます。

チェック

参照の値渡し:値渡しでメモリ番地を渡すことで、参照渡しに相当する機能を実現している

helpful