Вот грамматика для объявления, взятая из стандарта (& sect; 6.7.5):
<i>declarator</i>:
<i>pointer<sub>opt</sub> direct-declarator</i>
<i>direct-declarator</i>:
<i>identifier</i>
<code>(</code> <i>declarator</i> <code>)</code>
<i>direct-declarator</i> <code>[</code> <i>type-qualifier-list<sub>opt</sub> assignment-expression<sub>opt</sub></i> <code>]</code>
<i>direct-declarator</i> <code>[ static</code> <i>type-qualifier-list<sub>opt</sub> assignment-expression</i> <code>]</code>
<i>direct-declarator</i> <code>[</code> <i>type-qualifier-list</i> <code>static</code> <i>assignment-expression</i> <code>]</code>
<i>direct-declarator</i> <code>[</code> <i>type-qualifier-list<sub>opt</sub></i> <code>* ]</code>
<i>direct-declarator</i> <code>(</code> <i>parameter-type-list</i> <code>)</code>
<i>direct-declarator</i> <code>(</code> <i>identifier-list<sub>opt</sub></i> <code>)</code>
<i>pointer</i>:
<code>*</code> <i>type-qualifier-list<sub>opt</sub></i>
<code>*</code> <i>type-qualifier-list<sub>opt</sub> pointer</i>
<i>type-qualifier-list</i>:
<i>type-qualifier</i>
<i>type-qualifier-list type-qualifier</i>
<i>parameter-type-list</i>:
<i>parameter-list</i>
<i>parameter-list</i> <code>, ...</code>
<i>parameter-list</i>:
<i>parameter-declaration</i>
<i>parameter-list</i> <code>,</code> <i>parameter-declaration</i>
<i>parameter-declaration</i>:
<i>declaration-specifiers declarator</i>
<i>declaration-specifiers abstract-declarator<sub>opt</sub></i>
<i>identifier-list</i>:
<i>identifier</i>
<i>identifier-list</i> <code>,</code> <i>identifier</i>
Как видите, и []
, и ()
связываются с декларатором до *
. Возьми декларацию
int *a[N];
Декларатор - *a[N]
, который соответствует указателю opt , прямой декларатор , указанному выше, и поэтому анализируется как *(a[N])
, поэтому a
является N массив элементов указателя.
Подводя итог:
T *a[N] -- declares an N-element array of pointer to T
T (*a)[N] -- declares a pointer to an N-element array of T
T *f() -- declares a function returning pointer to T
T (*f)() -- declares a pointer to a function returning T