参照渡し
関数への引数の渡し方には「値渡し」と「参照渡し」があります。参照渡し(英:call by reference)とは、変数のメモリ番地(メモリ上の位置)を渡す方法です。
変数のメモリ番地を渡しているため、関数内で引数の値を変更すると、呼び出し元の変数も変更されてしまいます。
チェック
- 値渡し:変数の値(実体)をコピーして渡す方法
- 参照渡し:変数のメモリ番地を渡す方法
参照渡しの流れ
例えば、次のような「関数A」があるとします。「関数A」には「引数」があり、「関数A」を呼び出すときは引数を指定します。
変数の実体はメモリ上で管理されている
呼び出し元「変数A」の実体はメモリ上で管理されています。
"参照渡し"で関数を呼び出すと、実体のメモリ番地がコピーされる
この「変数A」を"参照渡し"で「関数A」に渡すと、「変数A」のメモリ番地(メモリ上の位置)を「関数A」に渡します。(メモリ上はメモリ番地がコピーされ「関数A」の引数はコピーされたメモリ番地を参照する)
結果、呼び出し元の「変数A」と呼び出された関数の「引数A」は同じ実体を参照しています。
そのため、関数内で「引数A」の値を変更すると、呼び出し元の「変数A」の値も変わります。
参照の値渡し
Javaなどの多くのプログラミング言語は、"参照の値渡し"により参照渡しに相当する機能を実現しています。
例えば、Javaではオブジェクトへの参照を参照型の値として管理しています。
参照型のイメージは次のとおりです。オブジェクトの実体とは別にメモリ番地(メモリ上の位置)が作られ、そのメモリ番地を参照しています。
この状態で"値渡し"をすると次のように、メモリ番地を"値渡し"で渡すことになります。
結果、「呼び出し元変数」と「関数の引数」は同じ実体のメモリ番地を参照しています。この動きを"参照の値渡し"といいます。
チェック
参照の値渡し:値渡しでメモリ番地を渡すことで、参照渡しに相当する機能を実現している