ポインタ

なんか日記じゃなくて週記になってることに気づいた。

最近、某実験のせいで、周りにC言語のポインタで困ってる人をよく見るんだけど、なんか混乱の原因ってポインタの概念が理解しづらいだけじゃなくて、C言語のポインタの表記の仕方にもあるような気がしてきた。

例えば次のようなプログラムを考える。

int *p;
/* … */
*p = 100;

最初の行でint*型の変数を宣言して、3行目でpの指す変数に代入を行ってるんだけど、よく見ると、1行目にも3行目のも「*p」という表現が出てくる。このアスタリスクが曲者で、1行目のアスタリスクはポインタを表す記号で、3行目のアスタリスクは逆参照(dereference)を表す記号だ。同じ「*p」という表現なんだけど、その意味するところは全然違うという罠。

次の2つとかひどい例。

int *p = NULL;
int *p;
*p = NULL;