今日も備忘録を残そう。
今日は値渡し(call by value)と参照渡し(call by reference)の話。
いつかは覚えてないけどここ3年程の間にC言語に参照渡しは無くて、全て値渡しだということを覚えた。
色々な入門サイトが参照渡しと言っているけれど全ては間違いだったんだっ!
自分の大好きなwisdom softもJAVAは参照渡しと言っている・・・軽く鬱。
嘆かわしいことに俺のバイブル、独習Cも参照渡しと言っている・・・。けど、著者が悩んだ末にあえて参照渡しと書いたような痕跡があった。
以下、引用。
特に指示しなければ、Cは値渡しで引数を渡します。つまり、関数を呼び出すために使われた引数に関数の内部から変更を加えることはできません。関数内部の仮引数に何が起こっても、外部の引数には影響しないのです。しかし、第6章で説明したように引数へのポインタを渡せば、参照渡しを実現できます。
出展:独習C, 著:Herbert Schildt, 訳:柏原 正三
指示すれば参照渡しができるとは言っていない!
あくまで実現できると言ってる・・・!
まあ、とにかくCとかJavaは参照渡しはできねーんだ・・・。
詳しい話はja.wikipediaとかこの議論にあった。
議論はなかなか読む価値があったと思う。
特に
何が引数に渡されるか? 値か? 参照か?という話ではなく、実引数をどのように仮引数に渡すか?
というくだりが凄く為になった。
そうそう、はじめてC言語はすべて値渡しと覚えたときには”所詮アドレスも値だから”って覚えてました。
なるほど・・・そうじゃないんだ!
もっとまとめようかと思ったけど、wikiと議論見ればわかるだろうし、先人が何人も似たような記事書いてるのでやめる。
wikipediaだと具体例が無くて分からなかったけど、このC#の例のおかげで理解できた。
http://ufcpp.net/study/csharp/sp_ref.html
なるほど、refをcallee,callerどっちにもつけている。
あれ・・・しかしwikiにはCのように明示的にアドレス演算子を使うものは参照渡しとは呼ばない。とあるんだけど・・・
refとか凄く明示的です・・・。
いや多分アドレス演算子じゃないからいいんだろうけどね。
まあ、とにかく本当の参照渡しが理解できてきた。
うんうん、今日も有意義な1日であった。
コメントを残す