自社で新人(以下フレッシュマン's)から質問を受けることがたまにあるのですがこの参照渡し、値渡しについてどうも私の認識とはズレが頻繁に起こるのでエントリしようと思います。
まず、C、C++でのポインタやC++での参照渡しなんですがフレッシュマン'sいわく「指し示すポインタが渡されるんですよね?と」この変数に対する操作は呼び出し元影響するらしい。
わし「ふむふむ。んじゃ値渡しは」
フレッシュマン's「えっと呼び出し元から呼び出し先にコピーされます。なので呼び出し先で変数を書き換えても大丈夫です」
ここでいつもぶちかましてやります。
わし「なるほどなぁ。いいか、よく聞いてくれよ。参照渡しなんてのは無いんだよ。全てコピーされるんだよ」
フレッシュマン's「けどポインタとか渡すと書きかえれますよ?」
わし「んじゃそのポインタの中身じゃなくてポインタ自身をを書き換えたらどうなんの?」
違うんです。関数の呼び出し元と呼び出し先はコピーされてるんです。ただそのコピーされた変数がポインタであれば値を見る際に指し示す先を見ることになるので同じ値が触れるんです。
どうも呼び出しのルールが2種類あるかのような理解をしているのでいつもこう説明します。引数が参照型なのか値型なのか(Cでいうならポインタ変数か普通の変数か)の違いであって呼び出し方がふたつあるんじゃないよと。
ここで誤解が含まれるとrefキーワードやらoutキーワードはどう理解するんでしょ??
(と、かましてみたはいいけど突込みが怖いなぁ・・・^^;;)