moonmile solutions 分室

ソフトウェア開発者の情報収集をリアルタイムで垂れ流し...という具合に行きます。

ポインタの書き方は「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 ;

のように書くとコンパイルエラーになるからね。