'.'或'->' C结构访问器[重复]

dba5bblo  于 2023-04-05  发布在  其他
关注(0)|答案(5)|浏览(93)

此问题在此处已有答案

Arrow operator (->) usage in C(12个答案)
5年前关闭。
在访问C结构中的数据时,.->之间有什么区别?我在几次尝试中找不到任何区别。两者都为我提供了访问所需数据的权限。

nue99wik

nue99wik1#

->操作符只是语法上的糖:

x->y

等于

(*x).y

括号是必要的,因为.运算符的优先级高于*运算符。

wz3gfoph

wz3gfoph2#

.与结构体一起使用。->与指针(指向结构体)一起使用。

mjqavswn

mjqavswn3#

6.5.2.3 结构和工会成员
制约因素
1.运算符的第一个操作数必须具有原子、限定或非限定结构或联合类型,第二个操作数必须命名该类型的成员。
2-〉操作符的第一个操作数必须具有类型“指向原子、限定或非限定结构的指针”或“指向原子、限定或非限定联合的指针”,第二个操作数必须命名所指向类型的成员。
语义学
3后缀表达式后跟.运算符和标识符指定结构或联合对象的成员。值是命名成员的值,如果第一个表达式是左值,则为左值。如果第一个表达式具有限定类型,则结果具有指定成员类型的限定版本。
4后缀表达式后接-〉操作符和标识符,指定结构或联合对象的成员。值是第一个表达式指向的对象的命名成员的值,并且是左值。96)如果第一个表达式是指向限定类型的指针,则结果具有指定成员类型的如此限定版本。

tcbh2hod

tcbh2hod4#

struct MyStruct
{
  int a;
}

MyStruct *st;
st->a = 10;

MyStruct st2;
st.a = 10;
xbp102n0

xbp102n05#

除了指向structs / unions的指针之外,->操作符和普通structs / unions或任何其他类型之间没有任何连接。->正在访问由指针指向的struct / union中的成员。这意味着,在创建具有成员的struct / union之后,struct / union成员可以由.访问(如果持有struct / union本身),也可以由->访问(如果持有pointerstruct / union
示例:

// 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);

您不能使用.(即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

相关问题