原です。

> 青山です。
> 
> なかなかまとまらず済みません。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を念
頭においてのことと限定すべきかと思います。