え!それって参照渡し?
- 1. え!それって参照渡し?
関数の引数
Bitz 村上 幸雄
開発環境:MacBook Pro (Retina, 13-inch, Late 2013) macOS 10.14 Xcode 10.0
発表日:2018/10/17
■はじめに
とても違和感を感じる用語がある。それは、『参照渡しだ』。
え!違うだろ?と感じていたが、いい機会なので、調べてみた。
■引数
引数と呼ばれるものにどんな種類があるのか、まずは列挙してみる。
実引数
関数に渡す値。
仮引数
関数が受け取った変数。
値渡し(call by value)
値が渡される。
ポインタ渡し
渡す値がアドレスの値渡し。
sum(1, 2);
int sum(int a, int b)
{
return a + b;
}
実引数
仮引数
- 2. 参照渡し
• 変数渡し(call by variable)
変数そのものを渡す。
• 参照渡し(call by reference)
参照渡しで、内部でアドレス情報を渡す方法。
■Pascal
Pascalでは,値渡し(call by value)と変数渡し(call by variable)が存在し、変数渡しは参照渡しに相
当する。
そもそもは、変数渡しの実装方法に参照渡しがある。参照渡しは、変数に対する参照(アドレス情報)
を渡す方法だ。
Inside Macintoshは、コードはPascalで記載されているが、それをC言語で利用する場合、varがつ
いた変数渡しの引数は、C言語ではポインターと読み替えていた。
具体的には、Inside Macintoshで以下のようにPascalで説明されていたとする。
これをC言語では、以下のように読み替える。
■C言語
C言語の関数の引数は全て値渡し。K&Rでしっかりと説明されている。
ポインタでアドレスの値を渡すのを参照渡しと呼ぶのは間違いだ。
■Java
Javaも全て値渡し。
ポインタ演算ができない、アドレス(参照)の値渡しが利用できるが、これを参照渡しと呼ぶのは、
如何なものか。
■C++
値渡しに加え、本物の参照渡しが存在する。
PROCEDURE GetPort(VAR port: GrafPtr);
Pascal
void GetPort (GrafPtr * port);
C言語