参照渡しって何だっけ
というわけで 引数の渡し方として よく 値渡し / 参照渡し があると言われます(言語にもよりますし、そもそもその二つ以外も存在します。
他に 参照の値渡し(共有渡し)もありますが、これも後述の見分け方するならば 値渡しであることをわかってもらえると思います。
レギュレーション
- ここでは構文上の話「のみ」します。糖衣構文とかマクロとかメモリとかアセンブリの話はしません。
- 参照渡しであるか そうでないか のみ話します。それ以外は基本的には値渡しでしょうが、詳しくは 評価戦略読んでください。
関数に於ける 仮引数 と 実引数 の関係
関数に渡すときの登場人物としては、渡す変数である「実引数」と 関数の中で受け取った変数である「仮引数」 が存在します。
この「実引数」と「仮引数」 への同じ代入構文を実施したときに 反映されるのが 「参照渡し」です
つまり、実引数に対して 仮引数がエイリアスとして機能するかという話です。
その為、ここに参照型/値型の話は登場しません。
これが満たせない Cのポインタの値渡しは 参照渡しではない という根拠としています。
関数以外の話として
私としては 参照変数(つまり上記でいうところのエイリアス関係が満たせている変数)が存在するかどうかとしても上記の話で解決したりします。
つまり 参照される変数が 参照された変数 と エイリアス関係であるかどうかです。
※ この参照変数という表現は そもそも参照型の値の入った変数の意としてもふつうに使われる(1,2) 語弊がある言い方なのでもしかしたらエイリアスと言い換えた方が良いかもしれません。
その為、 関数外で参照渡し云々言っているものも 同様に エイリアス関係が満たせているかが焦点となります。その為、ここに参照型/値型の話は登場しません。
以上。
追伸1: call by copy-restore と見分け付かないのでは?
上記の判断方法だと call by copy-restore が 参照渡しと判断されますが、まぁ最終的に参照渡しとしての反映するのでいいでしょと思います。
追伸2: 変数渡しと見分けつかないのでは?
参照渡しは変数渡しの実装の一つなので見分ける必要は無いのでは?