指针变量上的()在C中意味着什么

时间:2013-11-18 08:58:27

标签: c operators

我有一个小问题:

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

更一般,为什么需要()?

(它来自一个教程,但他们没有得到答案..)

5 个答案:

答案 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(简单的)和*pppp指向的事物)。无论您使用哪种方式,都可以访问相同的point

此处有两位运营商:.*。其中,.绑定得更紧密。因此,表达式*pp.x表示:首先,获取pp.x的值,然后查看其指向的内容。

但代码却反过来说:首先,查看pp指向的内容,然后访问该字段x

括号与(2 + 3) * 5中的功能相同,您从学校就知道了。