現在は理解しているが、習ったばかりの頃はとある理由で理解できなかった。
これがポインタを理解できない後輩や学生を教える人の参考になったらなぁという思いで書いてみる。
Cのポインタ
まずポインタの基本はこう
int *p;
p = 0x12345678; // ポインタへアドレスを代入
*p = 123; // pが指す領域へ代入
「ポインタがわからない」と言っている人も、多分ここはわかってるんじゃないかと思う。
本題
僕が混乱したのはこのケース
int *p = 123; // *pへ代入しているつもりだが、実際にはpへ代入している。
どうしてこのような間違いをしたかというと、C言語のポインタ定義のクセによる。
int* p, q; // pはポインタ、qはただのint
int *p, *q; // pもqもポインタ
何が言いたいかというと、「Cにおけるポインタの宣言方法は、ポインタ型を宣言しているように見えない」ということ。
「int*型のpを宣言している」のではなく、「int型の*pを宣言している」ようにしかみえない。
コードで示すと、
int *p = 123;
は
int *p;
*p = 123;
と同じだと勘違いしていた。実際には、
int *p;
p = 123;
なので、期待した動作をしないわけである。
このことが理解できてからは、ポインタについて躓くことはなくなった。
締め
Cのポインタ宣言は直感と違うと感じる。これがポインタ理解の妨げになっているのではないかと思う。
ただ、この記事を書いていて思ったのは、これは「ポインタが理解できない」というよりは「ポインタ宣言が理解できない」だという点。
やっぱり「ポインタが理解できない」人とは、躓いている場所が違うのかもしれない。
(余談)
crayon syntax highlighterを使っているのだけど、末尾に空行がついてしまうのはどうすればいいんだろう