【问题标题】:What does the () on a pointer variable means in C指针变量上的 () 在 C 中是什么意思
【发布时间】:2013-11-18 08:58:26
【问题描述】:

我有一个小问题:

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

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

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

【问题讨论】:

  • (∗ pp).x = p->x.

标签: c operators


【解决方案1】:

因为. 的优先级高于*。也就是说,没有括号,

*pp.x = 10;

代表

*(pp.x) = 10;

但是,pp 是一个指针。因此,. 操作符在它上面不起作用。 您需要使用-> 运算符来访问指向结构的指针的成员,或者在访问其成员之前使用括号取消引用指针。

【讨论】:

    【解决方案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 高于取消引用运算符*

    【讨论】:

      【解决方案3】:

      在数学中,括号用于表示运算符的优先级。

      在 C 中,. 运算符优先于 * 运算符。因此,如果没有括号,pp.x 将在 *pp 之前解释,从而导致编译错误。确实,pp 是一个指针,没有成员变量x

      【讨论】:

        【解决方案4】:

        确保order of evaluation。 p 和 pp 都是指向结构点类型的指针(“&”获取地址),而不是点本身。

        【讨论】:

        • 计算顺序与它无关,不要将它与运算符优先级混淆。求值顺序与操作数有关。本例中的操作数:评估子表达式*pp,评估(*pp).x,评估10。保证子表达式在它所属的表达式之前被评估。除此之外,不能保证*pp.x 是在10 之前还是之后评估的。 是评估的顺序。另一方面,运算符优先级决定执行顺序:() 的优先级高于.. 的优先级高于=
        【解决方案5】:

        您有一个名为ppoint,它有x 和y 坐标。

        然后,您有pp,它的类型为pointer to a point。这个pp 指向非常相似p。所以现在你有两种方法可以访问你的观点:p(简单的一种)和*pppp 指向的东西)。不管您使用哪种方式,您访问的都是同一个point

        这里有两个运算符:.*。其中,. 绑定得更紧密。所以*pp.x这个表达式的意思是:首先得到pp.x的值,然后看它指向什么。

        但代码希望反过来:首先,查看pp 指向的内容,然后访问其中的x 字段。

        括号的作用和(2 + 3) * 5中的一样,你在学校就知道了。

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 2011-08-30
          • 1970-01-01
          • 2021-11-25
          • 2021-07-31
          • 1970-01-01
          • 1970-01-01
          • 2020-11-04
          • 1970-01-01
          相关资源
          最近更新 更多