2011年3月9日水曜日

C言語初心者がポインタで引っかかる理由

C言語に触れ始めた当時、案の定ポインタで引っかかっていた口だが、今さらながらなんで引っかかっていたのかを考えてみた。

ポインタを勉強していて多くの人が引っかかるのはダブルポインタあたりだと思う。
二次元配列的なイメージが構築されるまではかなり苦労させられた覚えがある。
ただ、今思い返してみると、
元はといえばダブルポインタが分かりづらくなる原因は
ポインタを学習した時点でスッキリしないシコリのようなものあったからではないかと思う。

そしてそのシコリの主たる原因はその表記法にある気がする。
アスタリスク(*)の使い方が紛らわしいのだ。
例えば、次のようなクソみたいなコードを考える。
int *a;
*a = 1000;
int b = *a + 2;
このとき「b = 1002」だと言われれば、
「なるほどaはアドレスを示していて、*aとするとそのアドレスに格納されている値になるんだな」
というのはそれほど違和感なく理解できていた気がする。
ところが、以下のようなコードになったとき、
int *a = 1000;
int b = *a + 2;
このとき「bは1002じゃないよ。代入している1000はaのアドレスだから」と言われる。
ここでスッキリしないモノを感じた。感じながらもそういうものだと思って次に進んでしまったことがその後の理解に支障を来してしまった。

要するに分かりづらい原因は宣言時の*と普段の*では意味合いが違うという点にある
んじゃないかなぁと。
  • 普段の* : あるアドレス変数に対してそこに格納された値
  • 宣言時の* : アドレス値を格納できる型
を表していることがわかりづらい。
int *aは正確には(int *)という型のaだと宣言しているだけということらしい。
だから宣言時の代入はあくまでa = 1000なのだ。

この場所による*の意味合いが違うことがポインタへの理解を阻害している気がする。
少なくとも俺はそうだったみたい。

0 件のコメント:

コメントを投稿