C定义中的运算符优先级

C定义中的运算符优先级,c,definition,operator-precedence,C,Definition,Operator Precedence,声明在求值过程中,[]运算符先于*运算符 那么,为什么会有以下说法: char *a[3]; 声明一个由3个字符组成的数组指针,而不是根据运算符优先级声明一个指向3个字符数组的指针 因为正如维基百科所说,[]的优先级高于* 处理声明时,a[3]在处理*之前被处理为“3的数组” 要声明指向三个字符数组的指针,必须使用括号覆盖默认优先级: char (*a)[3]; 现在括号优先于数组。我对这个问题感到困惑-声明的解释与运算符的优先级匹配。如果需要指向数组的指针,则必须在绑定[]之前使用pare

声明在求值过程中,
[]
运算符先于
*
运算符

那么,为什么会有以下说法:

char *a[3];

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

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

处理声明时,
a[3]
在处理
*
之前被处理为“3的数组”

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

char (*a)[3];

现在括号优先于数组。

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

char (*a)[3];

以下是来自(§6.7.5)的声明符语法:

如您所见,
[]
()
*
之前绑定到声明符。以宣言为例

int *a[N];
声明符是
*a[N]
,它符合上面的pointeropt直接声明符模式,因此被解析为
*(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  

但是,声明难道不像其他答案中所说的那样有单独的解释规则吗?@crypto,C语言中声明语法的全部要点是“声明模仿使用”。@crypto:不,不是真的。正如@AProgrammer所说,C声明系统的设计是这样的:声明模仿使用。因此,
a[0]
是一个
char*
,而
*a[0]
是一个
char
@crypto:请看下面我的答案。是的,声明有不同的产生式规则,但它们遵循与表达式相同的优先级规则。类似:具体参见关于
cdecl
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