C定义中的运算符优先级

维基百科声称[]运算符在评估中位于*运算符之前。

那么,为什么以下声明:

 char *a[3]; 

声明一个由3个字符指针组成的数组,而不是根据运算符优先级指向3个字符数组的指针?

因为,正如维基百科所说, []优先级高于*

处理声明时, a[3]在处理*之前被处理为’数组3’。

要声明指向三个字符数组的指针,必须使用括号覆盖默认优先级:

 char (*a)[3]; 

现在圆括号优先于数组。

这是声明符的语法,取自标准 (第6.7.5节):

 声明者指针选择直接声明器

 直接声明者识别码
     ( 声明者 )
     direct-declarator [ type-qualifier-list opt assignment-expression opt ]
     direct-declarator [ static type-qualifier-list opt assignment-expression ]
     direct-declarator [ type-qualifier-list static assignment-expression ]
     direct-declarator [ type-qualifier-list opt * ]
     direct-declarator ( 参数类型列表 )
     direct-declarator ( identifier-list opt )

 指针* type-qualifier-list opt
     * type-qualifier-list opt指针

 type-qualifier-list类型限定符
     type-qualifier-list type-qualifier

 参数类型列表参数列表
     参数列表 , ...

 参数列表参数声明
     参数列表 , 参数声明

 参数声明声明说明符声明符
     declaration-specifiers abstract-declarator opt

 标识符列表识别码
     标识符列表 , 标识符

如您所见, []()绑定到*之前的声明* 。 接受宣言

 int *a[N]; 

声明符是*a[N] ,它符合上面的指针opt direct-declarator模式,因此被解析为*(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 

我对这个问题感到困惑 – 声明的解释与运算符优先级相匹配。 如果你想要一个指向数组的指针,你必须使用parens在[]绑定之前将*绑定到’标识符’。

 char (*a)[3];