参照の値渡し
読み:さんしょうわたし

 プログラミング言語などにおける、関数メソッド等への引数の渡し方の一つで、参照値を値渡しするもの。共有渡しとも。
目次

概要
 例えばJavaは、メソッドへの引数はプリミティブ型でも参照型でも、全て値渡しで渡される。
 この時、メソッドの引数に変数そのものの参照を渡した場合、参照が値渡しされる。これが参照の値渡しである。
 なお、Javaの参照とは参照値のことであり、つまりオブジェクトに対するポインターである。これは例えばC++などの参照とは概念的に異なるものであるので注意が必要である。

特徴

ポインター渡し
 Javaの参照の値渡しは、C/C++でいうところのポインター渡しである。参照の値渡しという表現は参照という値の渡し方がプログラミング言語で発生してからの呼称ではあるが、そう呼ばれる以前から、大抵のプログラミング言語はオブジェクトを渡すときはこの形態となる。
 C++などの参照渡しと呼称は似ているが、参照渡しはメモリー上で同じ場所を指す参照を別名として渡すのに対し、参照の値渡しは単にポインターを渡すだけなので、渡された先での値の書き換え方によっては参照渡しとは動作結果が異なる。ただ、ポインターを渡すとは言ってもC/C++のようなポインター変数を使うのではなく、呼び出し先では変数は参照として受け取る。このため参照の値渡しと呼ばれる。

仮引数に対して書き換え
 参照渡しでも参照の値渡しでも、呼び出し先でその仮引数に対して書き換えを実施すると、呼び出し元も同様に変化する。
 ただし呼び出し先で新しいオブジェクトを作成し仮引数の指す先を書き換えた場合、参照渡しと参照の値渡しでは結果が異なる。
 参照渡しの場合はそのオブジェクトに置き換わるため呼び出し元にもその新しいオブジェクトが反映されるが、参照の値渡しの場合は仮引数の値を変えるだけであり呼び出し元には影響しない。
 つまり参照の値渡しでは新しいオブジェクトを返すということはできず、受け取ったオブジェクトを書き換えることができるだけである。

再検索