ポインタ変数なのか、ポインタ型なのか、
C でポインタを定義するときの書き方には、3つの流派があるようだ:
- ポインタ「変数」派
-
int *p;
- 変数
p
はポインタ変数という特別な変数だ、という主張。 - (
p
を逆参照*1した結果である)*p
の型はint
だよ、という形での型付け。
- 変数
- ポインタ「型」派
-
int* p;
- 変数
p
の型はポインタ型という特別な型だ、という主張。 - 変数
p
の型はint*
だよ、という形での型付け。
- 変数
- 中立派
-
int * p;
- なんだかポインタを定義するときの
*
の左右どっちに空白を入れるかでもめてる連中がいるから、とりあえず両方に入れとこうぜ、的な日和見。 - 少なくとも僕は、「
int*p
」という書き方は見たことがない。
- なんだかポインタを定義するときの
C++ には型テンプレートの考え方があるので、ポインタの
*
もその一種だと考えるポインタ型スタイルの方が一貫した解釈だと僕には感じられる。std::auto_ptr<int>
のように *<int>
として int*
を解釈するわけだ。だが、ポインタを定義する際のこのような振る舞いを考えると、C の元来の考え方はポインタ変数スタイルだったのかもしれない:
int* p, q; // p は int へのポインタだが、q は単なる int 型の変数 (!) int *r, s; // r は int へのポインタで、s は単なる int 型の変数 (自然)
とりあえず、逆参照の演算子 *
が前置でよかったなと思う今日この頃((Java や C# の「int[] array;
」という書き方が C++ でもできればいいのに。))。