以下声明有什么区别?
char *argv[];
和
char *(argv[]);
我认为根据螺旋规则是一样的。
以下声明有什么区别?
char *argv[];
和
char *(argv[]);
我认为根据螺旋规则是一样的。
如所写,括号没有区别。
所谓的螺旋规则脱离了 C 语法的这个简单事实:后缀运算符如()
and[]
比一元运算符如 具有更高的优先级,因此像and这样的*
表达式被解析为and 。*f()
*a[]
*(f())
*(a[])
所以给定一个相对复杂的表达式,比如
*(*(*foo)())[N]
它解析为
foo -- foo
(*foo) -- is a pointer (parens force grouping)
(*foo)() -- to a function
(*(*foo)()) -- returning a pointer (parens force grouping again)
(*(*foo)())[N] -- to an array
*(*(*foo)())[N] -- of pointer
是的,它们是一样的。char *(argv[])
仍然意味着一个指针数组。
char (*argv)[]
会有所不同,因为它意味着指向char
's数组的指针。
argv[]
不是类型,所以(argv[])
不能是函数声明 - 它是优先操作。[]
(优先与否)然后*
,就像我们对 所做的那样*argv[]
,因此它们是相等的。