ポインタ変数なのか、ポインタ型なのか、

C でポインタを定義するときの書き方には、3つの流派があるようだ:

ポインタ「変数」派

int *p;

  • 変数 p はポインタ変数という特別な変数だ、という主張。
  • (p を逆参照*1した結果である) *p の型は int だよ、という形での型付け。
ポインタ「型」派

int* p;

  • 変数 p の型はポインタ型という特別な型だ、という主張。
  • 変数 p の型は int* だよ、という形での型付け。
中立派

int * p;

  • なんだかポインタを定義するときの * の左右どっちに空白を入れるかでもめてる連中がいるから、とりあえず両方に入れとこうぜ、的な日和見
  • 少なくとも僕は、「int*p」という書き方は見たことがない。
どれがいいのかは宗教論争にしかならないので止めておこう。こんなことぐらい、それぞれの好みで書けばいいし、どう書かれていても同じように読めて当然だろう*2。実際、C++ 標準の規格文書の中でも、ポインタ変数スタイルとポインタ型スタイルの両方が登場する (中立派の書き方は見当たらなかった)。
C++ には型テンプレートの考え方があるので、ポインタの * もその一種だと考えるポインタ型スタイルの方が一貫した解釈だと僕には感じられる。std::auto_ptr<int> のように *<int> として int* を解釈するわけだ。
だが、ポインタを定義する際のこのような振る舞いを考えると、C の元来の考え方はポインタ変数スタイルだったのかもしれない:

int* p, q; // p は int へのポインタだが、q は単なる int 型の変数 (!)
int *r, s; // r は int へのポインタで、s は単なる int 型の変数 (自然)

とりあえず、逆参照の演算子 * が前置でよかったなと思う今日この頃((JavaC# の「int[] array;」という書き方が C++ でもできればいいのに。))。

*1:どうでもいいが、この「逆参照」っていう訳語はどうにかならないものか。

*2:中立派の書き方は、僕には、乗算式のように見えて読みにくいが。