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-liststatic
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];