答案 0 :(得分:7)
正如维基百科所说,[]
的优先级高于*
?
处理声明后,a[3]
会在处理*
之前被处理为'数组3'。
要声明指向三个字符数组的指针,必须使用括号覆盖默认优先级:
char (*a)[3];
现在圆括号优先于数组。
答案 1 :(得分:2)
以下是standard(第6.7.5节)中声明者的语法:
declarator: pointeropt direct-declarator direct-declarator: identifier(
declarator)
direct-declarator[
type-qualifier-listopt assignment-expressionopt]
direct-declarator[ static
type-qualifier-listopt assignment-expression]
direct-declarator[
type-qualifier-liststatic
assignment-expression]
direct-declarator[
type-qualifier-listopt* ]
direct-declarator(
parameter-type-list)
direct-declarator(
identifier-listopt)
pointer:*
type-qualifier-listopt*
type-qualifier-listopt pointer type-qualifier-list: type-qualifier type-qualifier-list type-qualifier parameter-type-list: parameter-list parameter-list, ...
parameter-list: parameter-declaration parameter-list,
parameter-declaration parameter-declaration: declaration-specifiers declarator declaration-specifiers abstract-declaratoropt identifier-list: identifier identifier-list,
identifier
如您所见,[]
和()
都绑定到*
之前的声明符。接受声明
int *a[N];
声明符是*a[N]
,它符合上面的指针 opt direct-declarator 模式,因此被解析为*(a[N])
,所以{ {1}}是指针的N元素数组。
总结一下:
a
答案 2 :(得分:0)
我对这个问题很困惑 - 声明的解释与运算符优先级相匹配。如果你想要一个指向数组的指针,你必须使用parens在*
绑定之前将[]
绑定到“标识符”。
char (*a)[3];