参照渡し 【call by reference】 参照呼び出し / リファレンス渡し

概要

参照渡し(call by reference)とは、コンピュータプログラム中で関数やプロシージャなどに渡す引数として変数などを指定する際、呼び出し先でも同じ実体を参照するように渡す方式。渡された引数に変更を加えると呼び出し元にも同じように反映される。

プログラム中で関数などを呼び出す際に、処理に反映させるパラメータなどを呼び出し元が指定することができる。呼び出し元が呼び出し文中で指定するものを実引数、呼び出された側が実引数を受け取るために用いる変数などを仮引数という。

実引数として定数リテラルを渡す場合には、仮引数にその値が代入されて処理に用いられるだけだが、実引数に呼び出し側が使用している変数やオブジェクトなどを指定する場合、実引数の変数名で表される実体と仮引数の変数名で表される実体との関係をどのように扱うかという問題がある。

参照渡しは仮引数実引数が完全に同じ実体を表すように引数を受け渡す方式で、呼び出し先が仮引数に新しい値を代入するなどの変更を行うと、呼び出し元の実引数に指定された変数などにも変更が反映される。

一方、実引数から仮引数へ値のみを複製して渡し、両者が異なる実体として扱われる引き渡し方法を「値渡し」(call by value)という。値渡しか参照渡しかはプログラミング言語によって決まっているが、参照渡しが可能な言語では値渡しも選択できるようになっていることが多い。

ポインタ渡しとの違い

C言語やJavaなどでは、変数などへの参照を表す値(Cにおけるポインタの値など)を複製して引き渡す「ポインタ渡し」が参照渡しにほぼ相当する機能として提供される。

(本来の)参照渡しは呼び出し先で参照先を変更するような操作(新しいオブジェクトを生成して代入するなど)を行うと呼び出し元にもその変更が反映されるが、ポインタ渡しは参照を表す値を渡しているだけなので、参照先を変更しても呼び出し元の参照先は呼び出し前と変わらない。

これは参照渡しが「参照の参照」を渡して参照に対する変更を反映しているように動作する(実際そのように実装している言語もある)ためで、ポインタ渡しを「参照の値渡し」、参照渡しを「参照の参照渡し」のように呼ぶ場合もある。

(2021.8.9更新)

他の辞典による解説 (外部サイト)

この記事の著者 : (株)インセプト IT用語辞典 e-Words 編集部
1997年8月より「IT用語辞典 e-Words」を執筆・編集しています。累計公開記事数は1万ページ以上、累計サイト訪問者数は1億人以上です。学術論文や官公庁の資料などへも多数の記事が引用・参照されています。