C/C++の宣言は内側から外へ向けて読んでいく。
配列の[]や関数の()は他よりも優先順位が高い。
()により優先順位を明示することも出来る。

時には複雑怪奇な宣言にも出会うだろうが、基本はそれで読めるはず。

int *q[5] は q -> [5] -> * -> int
の順で読める。
「q is an array[5] of pointer to int」
「q は int* を格納する5要素の配列」

int (*q)[5] は q -> * -> [5] -> int
の順で読める。
「q is a pointer to an array[5] of int」
「q は int を格納する5要素の配列へのポインタ」