ポインタの書き方は「int *i」なのか「int* i」なのか?
10年以上、考えていたことなのだが、C言語のポインタ「*」の宣言って、どちらの書き方が正しい/素直なのだろうか、という疑問が氷解しました。
int *i ; // のように、変数側に * をくっつけるのか? int* i; // のように、int型のほうに*をくっつけるのか?
まぁ、どちらでもコンパイラは通るわけで、どちらでもいいと良いといえばそれまでなんですが...でも、変数を2つ以上宣言する時に、
int *i, *j ; // これは、2つのint型のポインタを示す int *i, j ; // これは、1つのint型のポインタと、int型の変数を示す
ということになるので、
int* i, j ; // int のほうにくっ付けると、2つのポインタ型のように見えてしまう
ということです。
というわけで、「*」は、変数のほうにくっ付けるのが「意味」的に正しいですよね。これって、K&R の本にかいてあったっけ?
int i=10; int *p = &i;
int *q = &i;
のような書き方を、
int i=10; int *p = &i, *q = &i ;
のように書くわけで、「*」の記号は変数に対して右結合になっています。
int i=10; int* p = &i, q = &i ;
のように書くとコンパイルエラーになるからね。