圆括号对C中指针的影响是什么

时间:2014-06-19 04:59:47

标签: c pointers

例如,

之间有什么区别
(*user1).id

*user1.id

有一个例子来解释会好得多。 谢谢!

3 个答案:

答案 0 :(得分:12)

  1. (*user1).id取消引用user1,它必须是指向包含id字段的结构的指针,并从该结构中获取id字段。 100%相当于user1->id

  2. *user1.idid中获取字段user1id必须是包含id字段的结构(不是指向结构的指针)。然后取消引用该值,这意味着.字段必须具有指针类型。

  3. 所有这一切都很简单C operator precedence*(按引用选择元素)运算符的优先级高于{{1}}(间接/解除引用)运算符。

答案 1 :(得分:4)

没有括号,。 (点)运算符优先于(即绑定比)运算符更接近。 http://en.cppreference.com/w/cpp/language/operator_precedence

此示例中的括号首先绑定较低优先级的运算符。

*user1.id

相当于:

*(user1.id)   The * operator dereferences .id, which if .id is not a pointer, is illegal syntax

不同
(*user1).id   The * operator dereferences user1, which must be a pointer, to get the id member

解析树缩减看起来像:

    (*user1).id
    member_expression
    ( struct_expression )              DOT member
    ( pointer_expression )             DOT member
    ( DEREFERENCE_OP IDENTIFIER )      DOT member )
    ( DEREFERENCE_OP IDENTIFIER )      DOT IDENTIFIER )

VS

    *user1.id 
    DEREFERENCE_OP user1.id
    DEREFERENCE_OP ( member_expression )
    DEREFERENCE_OP ( struct_expression DOT member )
    DEREFERENCE_OP ( IDENTIFIER        DOT member )
    DEREFERENCE_OP ( IDENTIFIER        DOT IDENTIFIER ) 

答案 2 :(得分:1)

以下是您可以看到+ - 的样子,在第一个(在下图中),您需要将用户声明为:

    user user1;

并确保字段 id 是一个指针,因为这就是你要取消引用的内容!

在第二个中你必须声明如下:

    user* user1;

此处 id 有任何类型

enter image description here