2

以下声明有什么区别?

char *argv[];

char *(argv[]);

我认为根据螺旋规则是一样的。

4

3 回答 3

3

如所写,括号没有区别。

所谓的螺旋规则脱离了 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
于 2011-09-20T16:04:41.293 回答
2

是的,它们是一样的。char *(argv[])仍然意味着一个指针数组

char (*argv)[]会有所不同,因为它意味着指向char's数组的指针。

于 2011-09-20T14:48:59.203 回答
1
  1. argv[]不是类型,所以(argv[])不能是函数声明 - 它是优先操作。
  2. 使用螺旋规则,我们首先找到[](优先与否)然后*,就像我们对 所做的那样*argv[],因此它们是相等的。
于 2011-09-20T14:49:31.070 回答