配列へのポインタ?ポインタの配列??


参考

プログラミング言語C 第2版
付録A8.宣言

配列へのポインタ

int (*foo)[5];

分解すると、
declaration-specifiers : int
init-declarator-list : (*foo)[5]

ここではdeclaration-specifiersはtype-specifierをひとつだけ含みそれがint

init-declarator-listはひとつのinit-declaratorからなり、さらにそれはひとつのdeclaratorからなる
それが(*foo)[5]

declarator : (*foo)[5]をさらに分解すると、
direct-declarator[ constant-expression ]
→( declarator )[ constant-expression ]
→( pointer direct-declarator )[ constant-expression ]
→( pointer identifier )[ constant-expression ]
の形になっており、
pointer : *
identifier : foo
constant-expression : 5

括弧でpointerとidentifierが結び付けられているので
「fooはポインタ」であり、
最終的に、
identifierfooの型名は、
「整数からなる5個の配列へのポインタ」
となる。

ポインタの配列

int *bar[5];

同様に分解すると
type-specifier pointer identifier[ constant-expression ]
の形になり、ここで、
pointer identifider[ constant-expression ]
の部分は先ほどと違い、
identifier[ constant-expression ]がdirect-declaratorであるので、
「barは5個の配列」であり、
最終的に、
identifierbarの型名は、
「整数のポインタからなる5個の配列」
となる。