我有一个小问题:
struct point {int x ; int y;};
int main(){
struct point p = {10,20};
struct point *pp = &p;
(∗ pp).x = 10; // what is happening here
int y= (∗ pp).y; return 0} // what is happening here
更一般,为什么需要()?
(它来自一个教程,但他们没有得到答案..)
答案 0 :(得分:4)
因为.
的优先级高于*
。也就是说,没有括号,
*pp.x = 10;
代表
*(pp.x) = 10;
但是,pp
是一个指针。因此,.
运算符不起作用。
您需要使用->
运算符来访问指向struct的指针的成员,或者在访问其成员之前使用括号来取消引用指针。
答案 1 :(得分:2)
如果您有一个指针(如变量pp
),则可以使用取消引用运算符*
取消引用它。它与地址运算符&
相反。敌人的例子:
int a = 5;
int *pa = &a; /* Use address-of operator to get a pointer to `a` */
int b = *pa; /* Use dereference operator to get the value that `pa` points to */
当涉及到结构时,通常使用->
运算符来访问结构指针的成员字段,或非指针结构的.
运算符。当您取消引用指向结构的指针时,您将获得结构的非指针版本,并且必须使用.
运算符来访问成员字段。
括号是因为.
运算符的高度operator precedence比去引用运算符*
高。
答案 2 :(得分:2)
与数学一样,括号用于表示运算符的优先级。
在C中,.
运算符优先于*
运算符。因此,如果没有括号,pp.x
将在*pp
之前解释,从而导致编译错误。实际上,pp
是一个指针,没有成员变量x
。
答案 3 :(得分:1)
确保order of evaluation。 p和pp都是指针(“&”取地址)为一种结构点,而不是点本身。
答案 4 :(得分:1)
您有point
名为p
,其中包含x和y坐标。
然后,您的pp
类型为pointer to a point
。此pp
指向非常相同的点p
。现在,您有两种方法可以访问您的观点:p
(简单的)和*pp
(pp
指向的事物)。无论您使用哪种方式,都可以访问相同的point
。
此处有两位运营商:.
和*
。其中,.
绑定得更紧密。因此,表达式*pp.x
表示:首先,获取pp.x
的值,然后查看其指向的内容。
但代码却反过来说:首先,查看pp
指向的内容,然后访问该字段x
。
括号与(2 + 3) * 5
中的功能相同,您从学校就知道了。