参照の値渡し
読み:さんしょうわたし
プログラミング言語
などにおける、
関数
や
メソッド
等への
引数
の渡し方の一つで、参照値を
値渡し
するもの。共有渡しとも。
目次
概要
特徴
ポインター渡し
仮引数に対して書き換え
概要
例えば
Java
は、
メソッド
への引数は
プリミティブ型
でも参照型でも、全て
値渡し
で渡される。
この時、メソッドの引数に変数そのものの参照を渡した場合、参照が値渡しされる。これが参照の値渡しである。
なお、Javaの
参照
とは参照値のことであり、つまりオブジェクトに対するポインターである。これは例えば
C++
などの参照とは概念的に異なるものであるので注意が必要である。
特徴
ポインター渡し
Javaの参照の値渡しは、
C/C++
でいうところの
ポインター渡し
である。参照の値渡しという表現は
参照
という値の渡し方がプログラミング言語で発生してからの呼称ではあるが、そう呼ばれる以前から、大抵のプログラミング言語はオブジェクトを渡すときはこの形態となる。
C++などの
参照渡し
と呼称は似ているが、参照渡しはメモリー上で同じ場所を指す参照を別名として渡すのに対し、参照の値渡しは単にポインターを渡すだけなので、渡された先での値の書き換え方によっては参照渡しとは動作結果が異なる。ただ、ポインターを渡すとは言っても
C/C++
のような
ポインター変数
を使うのではなく、呼び出し先では変数は参照として受け取る。このため参照の値渡しと呼ばれる。
仮引数に対して書き換え
参照渡しでも参照の値渡しでも、呼び出し先でその仮引数に対して書き換えを実施すると、呼び出し元も同様に変化する。
ただし呼び出し先で新しいオブジェクトを作成し仮引数の指す先を書き換えた場合、参照渡しと参照の値渡しでは結果が異なる。
参照渡しの場合はそのオブジェクトに置き換わるため呼び出し元にもその新しいオブジェクトが反映されるが、参照の値渡しの場合は仮引数の値を変えるだけであり呼び出し元には影響しない。
つまり参照の値渡しでは新しいオブジェクトを返すということはできず、受け取ったオブジェクトを書き換えることができるだけである。
再検索