ポインタと参照の違いは?

解決


もんち  2005-06-16 15:28:03  No: 57931  IP: 192.*.*.*

C++初心者です。
C++を勉強していて、少し気になったので質問させていただきました。

タイトルどおりなのですが、ポインタと参照の違いって具体的にどういうものがあるのでしょうか?

少し考えてみたのですが
・参照は通常の変数と同じ方法でデータにアクセスできる
・ポインタは代入や演算をすることができる
といったことぐらいしか思いつきませんでした。
C言語を勉強し、その後C++へと移ったので参照よりポインタの方が慣れているのですが・・・
どちらのほうがいい、という意見をお持ちの方は教えてもらえないでしょうか?

編集 削除
tetrapod  2005-06-16 17:36:25  No: 57932  IP: 192.*.*.*

>・ポインタは代入や演算をすることができる
「ポインタそのものに対する演算」ってことですよね。
これがもっとも大きな違いです。

参照が指すインスタンスを指定できるのは初期化のときだけです。
なおかつ(ごく普通にプログラムを書く限りにおいて)
参照は必ず有効なインスタンスを指します。
ポインタそのものに対する演算を(不用意に)行うと、
ポインタが指す先が無効なインスタンスになることがあります。

int x=1, y=2;
int& r1=x;
int& r2=y;
int* p1=&x;
int* p2=&y;
r1=r2;  // x=y; と同じで r1 自身は x を指しつづける
++r1;   // ++x; と同じで r1 自身は x を指しつづける
p1=p2;  // p1 が指す先は y に変わる
++p1;   // p1 が指す先はもはや無意味

int* p=new int; delete p;
*p=0; // ここでは p は有効なインスタンスを指さない

文法解釈上どうしても参照で無いと実現できない機能ってのがいくつかあります。
struct T { ...
  T& operator=(const T&); // ポインタでは実装不可能
};
そういうのを除けば、ポインタも参照も記述の違いだけにしか見えなかったりします。
(実際コンパイラも同一のコードを生成したりしますし)

どちらがいい、というものではなくて、必要に応じて使い分けるものでしょう。

編集 削除
yukihiro  2005-06-16 17:56:49  No: 57933  IP: 192.*.*.*

こちらもどうぞ。
C++ FAQ Lite
http://www.parashift.com/c++-faq-lite/references.html#faq-8.6

編集 削除
もんち  2005-06-16 19:16:56  No: 57934  IP: 192.*.*.*

回答ありがとうございます。

ポインタのほうが、扱う上で気をつけなければならないことが多いということですかね…
ポインタと参照では得手不得手というのがあるのでしょうか。
場合に使い分けられるよう、心がけていきたいとおもいます。

ありがとうございました。

編集 削除