2021.5修改

后面我再看这个博客时,发现这通解释其实可读性不强,对新手不友好。。。故做一个类比。

       声明一个结构体好比跟上帝说我要一个XXX类型的背包,我自己有的背包(int、char等)不好用,装不了自己想要的东西。然后上帝就给你了。这时候,直接定义的结构体可以直接用“ . ”来访问,因为包就在你面前,实际给你了,空间也自动给你分配好了(不然怎么装东西),你直接用手拿就好了。

       然后后来你又跟上帝说:我想要一个可以绑XXX类型背包的绳子。然后上帝也给你了。这时候就是声明了一个XXX结构体类型的指针,但这时候你不能用 “ . ”来直接访问,因为用“ . ”访问相当于直接用手拿,但你连包都没有, 怎么直接用手拿呢?所以你需要再跟上帝要一个XXX类型的背包和绳子绑起来(此处相当于给结构体指针分配了一个空间)。每当你要访问的时候,就用“ -> ”来访问,相当于用绳子把背包拉过来访问。

------------------------------------------------------------------------------------------------------------------------

1、指向不同

一般情况下用“.”,只需要声明一个结构体。格式是,结构体类型名+结构体名。然后用结构体名加“.”加域名就可以引用域 了。因为自动分配了结构体的内存。如同 int a;一样。

而用“->”,则要声明一个结构体的指针,还要手动开辟一个该结构体的内存,然后把返回的指针给声明的结构体指针,才能用“->”正确引用。

否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。

2、读法不同

(*a).b 等价于 a->b。"."一般情况下读作"的”,他的前面是结构体。

“->”一般读作"指向的结构体的",其前面一定要是一个指向结构体的指针。

3、作用的不同

在“结构”一单元中出现的->运算符成为“右箭头选择”,在使用中可以用new_node->value = 10;来代替(*new_code).value = 10;

也就是说在结构中,运算符->是运算符*和运算符.的结合,在上述语句中,他先对new_node间接寻址以定位所指向的结构,然后再选择结构的成员value。

 

总结,如果只是定义一个结构体,用.来进行访问结构体中的成员。而如果定义了一个结构体指针,并已经分配了空间,则需要用->来访问其成员。

例子:

sturct s{
    int data;
};

struct s t1;
t1.data=1;

struct s *t2;
t2=(struct s*)malloc(sizeof(struct s));
t2=&t1;
t2->data=1;

 

 

本文参考自以下两篇文章。

https://blog.csdn.net/Clown_pan/article/details/90339915

https://zhidao.baidu.com/question/118239934.html

posted on 2021-04-02 12:00  苏打|汽水  阅读(251)  评论(0)    收藏  举报