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

[jfriends-ml 1568] Re: ポインタの定義



前橋です。

やました さん:
> 命令型の言語の「変数」には左辺値と右辺値があって、これの
> とりあつかいがそれぞれの言語で異なるのを明解に分類し、
> 説明したものがなかったというのがこれまでの状況なんでしょうか。

「変数」には左辺値と右辺値がありますね。それは、本当に
ポインタがないFORTRANなどでも同じです。

  hoge = 5; // このhogeは左辺値
  piyo = hoge; // このhogeは右辺値

というわけで、

> (0) 代入(assignment)命令がある

これはともかく、

> (1) 右辺の側で「変数」から左辺値をとりだす演算と
>     左辺値から右辺値をとりだす演算がある

ここの「左辺値」とは、変数を左辺値として扱うための値であるところの
「ポインタ」のことですね?

でも、ポインタも、いったん取り出すと単なる右辺値であって、
それを格納する「変数」には左辺値が存在します。そして、
Javaでは、その「変数」へのポインタをとりだすことができない
わけです。

が、Cでも、malloc()によりヒープへのポインタを得ることができるので、
Cのポインタは変数を指すものばかりではないわけです。
また、Javaでもnewしたオブジェクトへの参照を得ることが出来ます。

> 「Java にはポインタがない」 〓 「Java では(1)は偽」

というわけで、「ポインタ」を「変数へのポインタ」に限定すれば
(1)は偽ですが、「ポインタ」を「変数へのポインタ」に限定した
論調は見たことがありません。

> (2) 関数の呼出しの際、実引数と仮引数の結合が、左辺値でおこなわれる
>
> 「Java にはポインタがある」 〓 「Java では(2)は真」

これはさっぱりわかりませんが...

Javaの引数ってのは、モロに右辺値を渡してますよね(call by value)?

「参照orポインタ」のことを「左辺値」と呼ぶのなら、オブジェクトを
渡す場合に限り確かに参照渡しですが、呼び出され側でその参照は
別の変数に格納され、あまつさえ書き換えもできてしまうのだから、
「実引数と仮引数の結合が、左辺値でおこなわれる」ようには見えません。

                                               de 前橋