原です。 > 青山です。 > > なかなかまとまらず済みません。C++ で間違った記述をするとさらにややこし > くなるので、C でいきます。 だいぶややこしくなってきましたね。このスレッドはCでの 話としますね。 まず、 C言語では変数の参照渡しは存在しない というのを定説としてFIXしませんか?K&Rにもそうい う意味の記述があるし。従って、 > 値を参照渡し。 > > void foo(int *n) { > *n = 1; > } > main() { > int n = 0; > foo(&n); > } これを上の定説に逆らわない様に言えば、参照の値渡しです。 確かに n --> foo(&n) は、値の参照渡し的な操作ですが、ここは &n -> foo(&n) と考えて、つまり foo() のパラメータの授受だけに焦点を しぼって考えます。そういうわけで、 > で、Ruby は、参照を参照渡し、参照返し。 > > int* foo(int *n) { > *n = 1; > return n; > } > main() { > int obj; > int *n = &obj; > *n = 0; > foo(n); /* n = foo(n); などなど */ > } > > すべての操作がリファレンスベース。 これは「参照(ポインタ)の値渡し、値返し」と呼ぶことに なります。そしてこれこそが Ruby のC的なモデル(ruby の Cによる実装)というわけでした。(ruby の整数が即値であ ることはこの際無視。) 私が「参照の参照渡し」とか口走ったのがいけないのですが、 「参照渡し」はC++での話になります。前者の「参照」の 意味ですが、C++的には int& n の様な参照型の変数を意 味しています。C的には int* n の様なポインタ型変数を意 味する事もあるわけですが、C++では多分もっぱら参照型 を指すのではないかと想像します。(想像を明言してしまう 渡し、いや、私。^^;) したがって、Ruby では参照の値渡しだ、と言う時もCを念 頭においてのことと限定すべきかと思います。