読者です 読者をやめる 読者になる 読者になる

やはりCのポインタは難しいものだ……

ポインタと配列は一緒のもの?
違うよ、全然違うよ。

前に、同じ年の人が一時的に今の職場に来て、C言語できる。というから、ポインタと配列の違いが解かります?って聞いたら
「え?ポインタも配列も同じじゃないっすか。」
と言われた。
そうだよね。理解してる人に取っては、特に何でもないものなんだと思う。

char szMsg1[];
char *szMsg2;

という宣言があったら、
C言語のポインタを理解している人に取ってはszMsg1 とszMsg2 は同じ物じゃないだろうか?

なんか、前もこんな話があったような気がするけど、これらは全然違うよ。

少なくとも「ポインタ変数」は対象となる変数の場所(アドレス)を格納可能な変数であり、
「配列変数」は配列の領域を確保し、配列としての名前を持つ変数である。
ポインタは代入可能だが、配列名に対し代入することはできない。
また、配列は関数に渡すこともできない。
ポインタという概念は「わかったつもり」になるから、危険なのかもしれない。

そんな時代は、「C言語のポインタを理解できる」と銘打った本が世の中に沢山あった。
自分は一度もそういう本を読んだことがない。
だから、C言語の入門書で解説している概念だけで、ポインタは理解できたし、ポインタを説明するのにも、C言語の概念だけでいいと思う。
それ以上の知識は蛇足だと思う。
もっと、深く知りたい時には必要な知識だとは思うけれど、C言語のポインタを理解するのにアセンブリはいつ必要なんだ?ずっと知らなくても別に理解できるだろ?って思う。

さて、C言語のポインタって、ぶっちゃけただのアドレス値じゃない?
それ以上に何かあるとしたら、ポインタと配列は同じ様に扱う事が出来る。という事だろう。

アセンブリを持ち出してくるのは、
アセンブリで記述されるコードがまさに「アドレス操作」となるからだろうけれど、
これは自分も不要かもと思う。いまさら、LD (HL),Aでもありますまい。

ただ、アセンブリを知ればアドレスをイメージしやすくなる利点はあると思うけど。
経験としてZ80やったときにに学ぶことは多かったし。

で、ポインタと配列の違いに際して
odzさんのところをはっておく。
http://d.hatena.ne.jp/odz/20070817/1187345969
http://d.hatena.ne.jp/odz/20070819/1187513216
http://d.hatena.ne.jp/odz/20070820/1187622971
手抜き。orz...

で、やっぱり、Cのポインタは難しいんだなぁ、と思った。
自分が扱っているプログラムの中で制御している限りは「ポインタは単なるアドレス」という事になる。
でも、プログラマはそれが(世界の)全てではない、ということを知らなければいけないのかもしれない。

C言語では、const に関しても色々なテクニックがあるっていうか、常識なんだけれど
ポインタ値に対しての const なのか、ポインタ値が指している先の値に対しての const なのかによってかなり違う。
C++の参照なんかは、前者だね。一度設定した、ポインタ変数のアドレス値は変えられません。

参照の再代入ができないのはconstとはまた違う概念だと思うけれど……。
個人的にはconstは「constなメンバ関数」という概念が素晴らしいと思う。
これがあって、初めてconstなポインタやconstな参照が生きる。
そのconstも元々C++から標準化の際にCに取り入れられたものだと記憶しているけれど、
みあたらぬぬぬ。