とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

『三田典玄の「体育館の裏話」 - 関数の話(6)』につっこむ

前回では「ポインタ変数の定義」について書いた。
(snip)
前回の話で「ポインタ変数の定義の仕方」を説明したが、そのことをよく思い出してほしい。

ポインタ変数の定義の仕方?どこで説明していたでしょうか?説明していないものは思い出せません。
前回いくつかオブジェクトを定義していました。

  • char value;
  • char *value;
  • char* value;
  • char * value;

このうち char value; については(完全に間違っている)説明をしていますが,これらのうち,どれかがポインタ変数の定義であるとの説明はありません

どんな定義がされていようとも、「*が付こうがつくまいが、定義されているのは変数とその名前だけだ(前回の話で言えばvalueという変数だけだ)」ということをわかっていてほしい。

変数と名前が定義される? 意味不明。

とはいっても、使うためにはその「定義」をちゃんと理解している必要があるのは言うまでもない。

(引用順を入替,失礼。)その通り。自分で実践してください。規格書JIS X3010:2003 の 6.7 宣言 を熟読することをオススメします。定義とは宣言の内,3つある条件のいずれかを満たすもののことです。宣言から復習しましょう。

char *value;

で宣言され、定義された「value」という変数は、その「型」は「charへのポインタ変数型である」ということになる。

不正確です。「ポインタ変数」は俗語です。安易に使わないでください。
char *value; と宣言された時の value は「charへのポインタ型」です。これが正確な型です。「である」は不要です。おかしな表現を使わないでください。せめて「charへのポインタ型を持つ変数(オブジェクト)」と表現してください。

「value」の中に入っている「数値」は、どこか知らないところにあるchar型の変数へのポインタ(メモリ上のアドレスと同じだ)と、いうことになる。

不正確です。説明の途中で抽象度が変わっています(複数の抽象度が混ざっている)。
数値,メモリ,アドレスで一つの抽象(つうか,具体)。
char型,変数(オブジェクト),ポインタで一つの抽象。
正しくは『「宣言」直後の「value」の「値」は「不定」です。』です。不定であるからに,メモリ上のアドレスと対応する保証なんてありません。それに,一億と二千歩譲ったとしても,「どこか知らないところにある」が「char型」に掛かっているように読めてしまいます。char型はどこへも行きません。

value = 3;

と、valueに値を代入すると、その値「3」は「ポインタ(メモリ上のアドレス-のようなもの)」であり、その番地「3」には、「char型の変数」がある、ということになる。

うーん。抽象度がおかしくて指摘しにくいけど,C言語のオブジェクト自身は型情報を持っていません。「そこにchar型の変数がある」ではなくて,「そこをchar型のオブジェクトと見なす」とか,あるいは単純に「char型のオブジェクトを指す」と表現した方がいいと思う。

最後の方は良いこと言ってると思う。*の意味が文脈で異なるって事。


(続く)