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

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



前橋です。

遠藤さん:
>>・Javaには、C/C++における「ポインタ」が存在するが、それを
>>  「参照」と呼んでいる。
>
>これには異論があります。特に JNI プログラミングでは、
>Java の参照をポインターと呼んでしまうとはまるような気がします。

JNIプログラミングってやったことはないですし、全然知らないの
ですが、Javaのポインタが、native method からは、構造体とか、
いずれにせよ何かにtypedefされた別の型に見える、ということで
しょうか?

>>(1)Javaは、プリミティブのポインタをとることができない。
>これがとても重要だと思います。

現実問題として、C でも、プリミティブのポインタをとる時って、
参照渡しの代わりにポインタを渡す時ぐらいだと思うのですよ。
そして、それは有用ですし。

配列を回す時にプリミティブのポインタを++する、というコードは、
K&Rでは見ますが、最近あんまり見ない気がします。ちなみに私は
書きません。(おとなしく添字を使う)

>Java には、「クラスを離れたメソッドは無い」のですが、
>同様に、「関数ポインターは無い」です。
>「関数ポインターが無い」にもかかわらず、interface があれば簡潔に
>エレガントなコードが書けます。

Cの場合、printf()の printf は、宣言からすれば「関数のポインタ」
にはならんだろう、という話は置いときまして。

実験>
main()
{
    (***************printf)("hello world!\n");
}

継承/interfaceがあれば、関数のポインタは確かに(あまり)使わな
いでしょうね。

>>(4)Javaには、Cにおける「ポインタと配列の間の微妙な関係」はない。
>
>この代償として、配列は妙なコードを書かなくてはなりませんです。

そうですか? Javaで、配列がらみで妙なコードを書かなければなら
ないとすれば、それは配列がヒープにしか取れないことに起因して
いて、それ以外の所では、Cよりずっと綺麗なような。

>これもあるけど、難しい原因は「ポインターという概念」ではないかと。

そうですね。ポインタの概念を理解するのが難しい、というのは否
定しませんけど... その難しさはJavaでも解消されていないのでは。

>「ポインターはアドレスではない」というのを理解するのに
>私はすごく時間がかかりました。

これなんですよ。むしろ、連結リストやツリーみたいなデータ構造
を先に勉強した方が良さそうです。

>あと、用語の問題として、「ポインター型の変数」のこともポインターと呼ぶし、
>「ポインター型の値」のこともポインターと呼ぶので初心者は混乱します。

これはあるかもしれませんねえ。

人に Cを教えることもある身なので、気を付けることにします。

>以前紹介しましたが、C++ と Object Pascal と Java で swap() 関数問題を扱った
>Webページがありました。たいへん面白かったです。(Object Pascal って素敵^^;)

すみません。私はその頃はまだMLに入会していなかったのではと思
うので、できましたらURLを教えていただけないでしょうか?

面白そうです。

>>C に慣れた私としては、C++の参照型は、どうも好かんです。コー
>>ディングをだーっと読んでって、いつ変数の値がぶち壊される可能
>>性があるのかをつかみにくいと思います。
>
>C++ の参照型は、関数引数としてクラスをとる時に威力を発揮します。
># C++ に挫折した者の発言ですので不正確な情報かも知れません。

C++の参照型は、= 演算子のオーバーロードの時に威力を発揮します。
でも、私は、演算子のオーバーロード自体なくても良いと思ってい
るので、やっぱりなくても良い気がします。
あとは、参照を返す関数ですか。やっぱり混乱を招くだけのような。
# C++と格闘中の者の発言ですので、不正確な情報かも知れません。

関数のオーバーロードさえ、いまひとつ好きになれんです。まあ、
これは欲しいと思うことも多いんですけど...

>(それよりプリミティブを格納できるCollectionが欲しい。
>でも Int クラスを書いちゃったからいいや...)

template(というかgenericity)があれば作れますってば。

まあ、Javaの場合、将来的にgenericが実装される日が来たとして
も、パラメータとして渡せる型は、クラスだけになるんじゃないか
という気がしますけど。

------------------------------------------------------------
  前橋 和弥                             maebashi@xxxxxxxxxx
  中部ソフトエンジニアリング(株)
    〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
    Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------