[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: ポインターと参照




>ポインター = メモリーアドレスが入っている。つまりデータではない

いちおう格納されているのはアドレス値なのですが、
アセンブラでいう「アドレス」とはちょっと違います。

アセンブラでは、アドレスはただの番地であるという以上の意味は持ちません。

C では例えば、int a = 2; int *p = &a; で p に代入されたアドレス値は、
「intという型を持」ち、かつ
「int型の幅を持つ」領域のアドレスであることが保証されたアドレス値です。

「ポインターはアドレスではない」と書いたのは、少なくともアセンブラで言うアドレス
とは違うという意味です。

int *p = &a; の式にある & 演算子が「アドレス演算子」ではなく「ポインター演算子」と
呼ばれるのは、単なるアドレスではなく「int 型の値を格納してある領域」のアドレスを
返す演算子だからです。

>ポインターと参照が同じならば表記法が違うのはなぜ? 

こちらですが、C++ の参照はポインターとは違います。

[ポインターの場合]

int a = 2;
int b = 4;
int *p = &a;        // a の領域を指すように初期化
printf("%d\n", *p); // 2 を表示
p = &b;             // 今度は b の領域を指す 
printf("%d\n", *p); // 4 を表示

[参照の場合]

int a = 2;
int b = 4;
int& r = a;         // a の領域を指すように初期化
printf("%d\n", r);  // 2 を表示
r = &b;             // コンパイルエラー。(そもそも式として無理があるが...)

C++ の参照の場合、一度初期化したらずっと同じ領域を指し続けます。

>Java の参照と C++ の参照は違うらしい。 -> どう違うのか?

本当は Java でもポインターと呼びたいところですが、
C/C++ のポインターとは違うので参照と呼んでいます。
でも C++ の参照とも違うので困っちゃうわけです。^^;

JLS (Java Language Specification Java言語仕様) ではポインターと書いてあるので
また困っちゃうわけです。^^;

「4. 型,値及び変数
      4.3 参照型及び値
            4.3.1 オブジェクト」
 http://www.y-adagio.com/public/standards/tr_javalang/4.doc.htm#12028

 >参照値(しばしば単に 参照(references) と呼ぶ)は,オブジェクトへの ポインタ(pointers) もしくは,
 >いかなるオブジェクトも参照しない特別な空参照となる。 

JLS にこう書いてあるんじゃやっぱりポインターなのだろうか。^^;

>オブジェクト = 構造体 + 関数へのポインタ
>オブジェクトの参照 =  オブジェクトのデータが順番に入っている
>			メモリー領域の先頭アドレス。

アドレスなのかなあやっぱり。でも値として演算したりはできませんね。

>以前、遠藤さんが、「ポインターはアドレスではない」発言に「えっ」と思ったので
>かなり根本的な部分だったりするのでしょうが、質問しました。

これに気づくまで結構かかりました。

確かに「int へのポインター」でも「xxx型へのポインター」でも
「関数へのポインター」でもアドレス値が返ってくることにかわりはありませんが、
意味するものはまるで違います。

>あまりに複雑な部分なので、説明のしようがないと思いますから、
>皆さんに迷惑かける訳にもいきませんので「ここが理解しやすいサイト」
>とか、この本がわかりやすいなどの情報が欲しいです。

私は C 言語のポインターは、柴田望洋『秘伝C言語問答 ポインター編』ソフトバンク で学びました。

C++ 言語については、少し前なら ストラウストラップ『プログラミング言語 C++ 第2版』トッパン
をおすすめしたところですが、第3版が翻訳されたそうなので第3版が良いのでしょうか。
私自身C++には挫折した人間なので有用な助言はできそうにありませんが、
C++ についてはストラウストラップのものが一番良いのではないかと思います。

>特に、C++ と Javaの表記法の違いとか、ポリシーの違いとかが
>比較できるようなものが嬉しいです。

いろいろあると思いますが、コンパクトなものとしては

「オブジェクト指向言語比較」
 http://www.njk.co.jp/otg/Study/comp-language/

でしょうか。(JDK 1.0 時代のものなのでちょっと古いですが..)

>かなり勘違いしていると思いますが、まぁ突っ込みされる人間がいたほうが
>いろいろ勉強になると思うので、存分にいじめてください (^^;;)
いぢめないよう。(c)いがらしみきお^^;
------------------------------------------------------------------
遠藤靖之 (えんどう やすゆき) <yasuyuki@xxxxxxxxxx>
http://www.freepage.total.co.jp/jfriends/ (Java互助会ホームページ)
株式会社タイムインターメディア 情報通信サービス部 TEL 03-5362-9009
〒162-0065 新宿区住吉町3-11 新宿スパイアビル      FAX 03-5362-9008