2007年06月15日(金) [過去の今日]
#1 ポインタとリファレンス
先日 Cのポインタがわからん というのを、まあ半分愚痴なのだが何気に書いてみたところ、意外にも反応がもらえた。 参照(reference)とポインタの間の大きい(かも知れない)溝 という記事で、
参照 → increment/decrementのような操作ができない ポインタ → increment/decrementのような操作ができる
との由。
あれ、そうだっけ、と思ってやってみると、
$ perl -le 'sub hoge{(local(*i)) = @_; $i++;} my $i = 10; hoge(\$i);print $i;' 11
……できてるな。
ちょっと検索してみたら、 Q.Cにはreference(参照)が無いと聞きましたが本当でしょうか? referenceが無ければリンクリストすら表現できないと思うのですが? という質問と回答を見つけた。確かにreferenceとpointerの違いとして、
Cのポインターは+, -, ++, --(加算、減算、インクリメント、デクリメント)などの算術演算が可能
と、述べられてるな。
つまりあれか、俺がPerlのreferenceのつもりで言ってたのが、前の記事の某友人や反応くださった方にはJavaのreferenceとして認識されてたわけか。そりゃー違うわけだ。C++にも参照があるみたいだからそっちかもしれんな。
しかし、Perlの参照(reference)ってこう見るとCのポインタとほとんど変わらないように見えるなあ。配列型も関数型もいけるし、メモリアドレスというわけじゃないってのが違うくらいか。
さっきのワンライナーをCでやると、
#include <stdio.h> int hoge(int *i) { (*i)++; } int main() { int i; i = 10; hoge(&i); printf("%d\n", i); }
こんな感じか。 渡し方と受け取り方が違うだけに見えるなあ。
というわけで紛らわしい言い方してごめんよ >某友人。
紛らわしい書き方してごめんなさい & 反応ありがとうございました。 >雑記帖リターンズの方
(@040)