Cの型について

何度も同じネタを書いているけど、今日もプログラム関連の検索をしていると怪しい説明を見つけたので書いてみる。Cにおいて変数の型名は宣言から識別子を抜いたものである。

  1. int a; /* 型名int */
  2. double b;/* 型名double */
  3. char c; /* 型名char */

これは派生型になっても全く同じである

  1. int x[10]; /* 型名int[10] */
  2. double *y; /* 型名double * */
  3. char *z[8]; /* 型名char *[8] */
  4. char (*zz)[8]; /* 型名char (*)[8] */


4の()は省略できない。3と比較すれば両者は別物である。型名を日本語にしてみると以下のようになる。
3: charを指すポインタの配列[要素数8]
4: charの配列[要素数8]を指すポインタ



C解説サイトでよくある説明はvoid *を「void型ポインタ」などと表現するものだ。ひどいもので、「mallocはvoid型なのに値を戻す特殊な関数です」なんて言う説明をしているところがあった。


int *p;
という宣言があったときpの型はint*型であり間接参照(デリファレンスの方が通りがいいか)したときにint型として値を取り出すものだ。