// creating one instance of struct s, and a pointer to an instance of struct s. struct s is a struct holding one int called 'data'.
struct s{int data;}struct_s_instance, *struct_s_instance_pointer = malloc(sizeof(struct s));
struct_s_instance.data = 3; // access using the '.' operator
struct_s_instance_pointer->data = 4; // pointer access using the '->' operator
printf("%d-%d", struct_s_instance.data, struct_s_instance_pointer->data);
5条答案
按热度按时间nue99wik1#
->
操作符只是语法上的糖:等于
括号是必要的,因为
.
运算符的优先级高于*
运算符。wz3gfoph2#
.
与结构体一起使用。->
与指针(指向结构体)一起使用。mjqavswn3#
6.5.2.3 结构和工会成员
制约因素
1.运算符的第一个操作数必须具有原子、限定或非限定结构或联合类型,第二个操作数必须命名该类型的成员。
2-〉操作符的第一个操作数必须具有类型“指向原子、限定或非限定结构的指针”或“指向原子、限定或非限定联合的指针”,第二个操作数必须命名所指向类型的成员。
语义学
3后缀表达式后跟.运算符和标识符指定结构或联合对象的成员。值是命名成员的值,如果第一个表达式是左值,则为左值。如果第一个表达式具有限定类型,则结果具有指定成员类型的限定版本。
4后缀表达式后接-〉操作符和标识符,指定结构或联合对象的成员。值是第一个表达式指向的对象的命名成员的值,并且是左值。96)如果第一个表达式是指向限定类型的指针,则结果具有指定成员类型的如此限定版本。
tcbh2hod4#
xbp102n05#
除了指向
structs / unions
的指针之外,->
操作符和普通structs / unions
或任何其他类型之间没有任何连接。->
正在访问由指针指向的struct / union
中的成员。这意味着,在创建具有成员的struct / union
之后,struct / union
成员可以由.
访问(如果持有struct / union
本身),也可以由->
访问(如果持有pointer
到struct / union
)示例:
您不能使用
.
(即struct_s_instance_pointer.data
)访问struct_s_instance_pointer
中的data
,也不能使用->
(即struct_s_instance->data
)访问struct_s_instance
中的data
。这是完全不同的事情。请注意,当给定一个指针时,例如
struct_s_instance_pointer
,您可以取消引用它:*struct_s_instance_pointer
,然后可以并且应该使用运算符.
:(*struct_s_instance_pointer).data