是
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!
答案 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的数组。