等价C声明

时间:2011-03-25 18:04:47

标签: c declaration

int (*x)[10];

int x[10];

等效?

根据"Clockwise Spiral"规则,它们解析为不同的C声明。

对于点击厌倦:

  

大卫的“顺时针/螺旋规则”   安德森

     

有一种技术称为   ``顺时针/螺旋规则''哪个   允许任何C程序员解析   他们的头脑任何C声明!

     

有三个简单的步骤:

   1. Starting with the unknown element, move in a spiral/clockwise direction; 
          when ecountering the following elements replace them with the 
          corresponding english statements:

      [X] or []
          => Array X size of... or Array undefined size of... 
      (type1, type2)
          => function passing type1 and type2 returning... 
      *
          => pointer(s) to... 

   2. Keep doing this in a spiral/clockwise direction until all tokens have been covered.

   3. Always resolve anything in parenthesis first! 

5 个答案:

答案 0 :(得分:8)

阅读声明时跟随this simple process

  

从变量名称开始(或   最内层构造,如果没有标识符   存在。看起来没有跳跃   右括号;说什么你   看到。再看左边没有跳跃   在括号上;说出你所看到的。   如果是,请跳出括号的级别   任何。向右看;说出你所看到的。   看左边;说出你所看到的。继续   以这种方式直到你说出来   变量类型或返回类型。

所以:

int (*x)[10];

x是指向10 int s

的数组的指针
int x[10];

x是一个包含10 int s

的数组
int *x[10];

x是一个包含10个指向int s

的数组

答案 1 :(得分:8)

他们并不平等。在第一种情况下,x是指向10个整数数组的指针,在第二种情况下,x是一个包含10个整数的数组。

两种类型不同。通过在两种情况下检查sizeof,您可以看到它们不是一回事。

答案 2 :(得分:4)

我倾向于遵循理解C声明的优先规则,这在Peter van der Linden的书Expert C Programming - Deep C Secrets中得到了很好的解释

A - Declarations are read by starting with the name and then reading in 
precedence order.

B - The precedence, from high to low, is:
        B.1 parentheses grouping together parts of a declaration
        B.2 the postfix operators:
        parentheses () indicating a function, and
        square brackets [] indicating an array.
        B.3 the prefix operator: the asterisk denoting "pointer to".

C If a const and/or volatile keyword is next to a type specifier (e.g. int, 
        long, etc.) it applies to the type specifier. 
        Otherwise the const and/or volatile keyword 
        applies to the pointer asterisk on its immediate left.

答案 3 :(得分:2)

对我来说,更容易记住规则,因为在()之前没有任何明确的分组,[]*绑定。因此,对于像

这样的声明
T *a[N];

[]之前的*绑定,因此a是指针的N元素数组。分步说明:

   a     -- a
   a[N]  -- is an N-element array
  *a[N]  -- of pointer
T *a[N]  -- to T.

对于像

这样的声明
T (*a)[N];

parens强制*[]之前绑定,所以

    a      -- a
  (*a)     -- is a pointer
  (*a)[N]  -- to an N-element array
T (*a)[N]  -- of T

它仍然是顺时针/螺旋规则,只是以更紧凑的方式表达。

答案 4 :(得分:-4)

没有。第一个声明一个包含10个 int指针的数组,第二个声明一个包含10个int的数组。