1、结构体三要素:struct、{}、“;”
- struct,不然怎么叫结构体;
- “{}”,里面要包含结构体要定义的东西
- C语言语句结束离不开“;”
按理有这些就可以定义结构体了。
2、经常把我们搞迷惑的2个位置
位置1:通常叫tag
位置2:有typedef时是声明,没有typedef时是定义的变量
3、结构体的整体思维
我们是如何定义一个变量的?先写int,告诉编译器我们要用的类型和位宽(int),然后告诉编译器我们定义了一个变量名(本质是内存)x,最后我们完成赋值。
int x = 1;
那我们要怎么定义一个结构体变量?——找到现在谁能替代int就可以。
![](https://i-blog.csdnimg.cn/blog_migrate/0fda4af681bb60a520bd9e1b72e2b722.png)
4、结构体声明
如果结构体成员有100多行,怎么办?像图1这样去定义每个结构体吗?代码会爆炸。所以,把结构体提前在外进行声明,并且你要找个名字在位置1上来替代这个结构体,比如Node,可以理解为指代了{...}这一部分。
因此,此时图1就可以转换为图2的定义了
![](https://i-blog.csdnimg.cn/blog_migrate/531f7ac4322e11d3bf1b31fbc883340d.png)
问:能否只用Node,不用struct Node?
答:不行,会报错,编译器不认识Node,只认识struct Node
![](https://i-blog.csdnimg.cn/blog_migrate/1986f31d9d3fa5db09a4a733fdba8727.png)
问2:如果没有位置1,行不行?
答:行,那就是匿名结构体。匿名结构体要套在别的聚合(结构体/联合体)类型中,才对
问3:如果只有位置2呢?
答:相当于在main函数外定义了一个名字叫x的全局结构体变量。
5、就是不想写struct 有什么招?—— typedef
![](https://i-blog.csdnimg.cn/blog_migrate/58605b79647411ff3837eb18b503cdff.png)
使用typedef之后,把阴影部分,找了个替身MyNode,来代替了整个结构体。就像是int一样,找了个替身MyInt。替身和真主,都能同时起作用。
问题:下图Node t3,用的是哪个Node?
![](https://i-blog.csdnimg.cn/blog_migrate/7eb7ac5acf9ebfb2e2478c95ec2c7ea5.png)
答:用的是绿色框。因为同如果是红色的Node,报错将会同“unknown type name 'Node'; use 'struct' keyword to refer to the type”一样。但是此时,编译器能找到一个名叫Node的替身,它是合法的。那就用它吧。
6、我是声明/替身还是定义?
![](https://i-blog.csdnimg.cn/blog_migrate/c8fc7a33a2e58bf8b6b8f769aaaa599c.png)
7、我可以嵌套我自己吗?(自引用)
答:自己包含自己不行(红圈是错的),因为编译器一定要到这个“;”,才能构建出结构体。否则,并不知道要分配多大内存呀。
![](https://i-blog.csdnimg.cn/blog_migrate/649fe932b76ec8c61d979319a0ff66bf.png)
但是可以用指针,因为指针的位宽总是确定的。同样也不能用typedef定义的替身,因为编译器是一行一行扫描的,并不认识你最后的“替身”是谁。
![](https://i-blog.csdnimg.cn/blog_migrate/45f5f0d0e6184db097706f4d28c0ea7a.png)