例如,
之间有什么区别(*user1).id
和
*user1.id
有一个例子来解释会好得多。 谢谢!
答案 0 :(得分:12)
(*user1).id
取消引用user1
,它必须是指向包含id
字段的结构的指针,并从该结构中获取id
字段。 100%相当于user1->id
。
*user1.id
从id
中获取字段user1
,id
必须是包含id
字段的结构(不是指向结构的指针)。然后取消引用该值,这意味着.
字段必须具有指针类型。
所有这一切都很简单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 有任何类型