![](https://i-blog.csdnimg.cn/blog_migrate/0f44b3ff2f70af306c899ac0ce972ad2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/89bbca1912dda7a38dc004c915412b56.png)
结构体
A.声明一个结构体
![](https://i-blog.csdnimg.cn/blog_migrate/da939ff18b26d89a6563e00f7667d71a.png)
struct-结构体关键字 stu-结构体标签 char name[20]-成员变量
![](https://i-blog.csdnimg.cn/blog_migrate/a4f166b701f0082a97f567ca52b3500a.png)
B.匿名结构体类型
![](https://i-blog.csdnimg.cn/blog_migrate/1e43946035f9f27f7e10a4289d7f5da3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ca291f3918186c8db817dd2c2fa81a89.png)
这里分别创建的*psa和sa分别是独立创建的两个类型,两者类型不同,所以这里psa=&sa是无法指向sa的地址的。
C.结构体的自引用
![](https://i-blog.csdnimg.cn/blog_migrate/6efa9fd13c987cdd79690f729daa53be.png)
![](https://i-blog.csdnimg.cn/blog_migrate/87ed3d5eba5a5b43dff6d5395b9a686e.png)
错误,不能结构体声明是再其中包含自己。内存无法确定。
![](https://i-blog.csdnimg.cn/blog_migrate/fe4f5237c26b8f4e02cbd159ace52179.png)
正确
![](https://i-blog.csdnimg.cn/blog_migrate/fd79b1bacf3262f1084d3b70e7946047.png)
D.typedef
![](https://i-blog.csdnimg.cn/blog_migrate/bf298c224266a8ee533ccfb493dff5d9.png)
正确
![](https://i-blog.csdnimg.cn/blog_migrate/e4928272b33eb1761fa4fa399b5d1863.png)
错误
这里只是将结构体类型重新命名为Node,并未定义变量,而这又是匿名结构体类型所以错误。
结构体内存对齐
![](https://i-blog.csdnimg.cn/blog_migrate/70628628bad5379566820a812dd869d1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4439ce1fa3e1c249ace8e0a90731048d.png)
struct s1
![](https://i-blog.csdnimg.cn/blog_migrate/aca61e862bb64eae84afcde31b4f0f9a.png)
struct s2
![](https://i-blog.csdnimg.cn/blog_migrate/1e0dffb9d73a77283d2ceafedb355815.png)
练习
1.
![](https://i-blog.csdnimg.cn/blog_migrate/d15b9b92b383d611203ded57b5abee2b.png)
答案16
2.
![](https://i-blog.csdnimg.cn/blog_migrate/64168f488395ef03ede30b12edbd1e2d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/022a0f2490d4ede061e0a10eb3cc9f1f.png)
答案32
![](https://i-blog.csdnimg.cn/blog_migrate/4600b533a5fefd0682bf68ef46bea55a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f5632b564eca79072c120a6f95bca683.png)
第一种
读取c要1次 读取a要2次
第二种
读取c要1次 读取a要1次(效率更高)
![](https://i-blog.csdnimg.cn/blog_migrate/92f6227cf1b14fe054a9a63ab2e725f2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7309f4ea818c05664375450818eed467.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a707034c29dc86543014c56d34e49fc7.png)
Tip1.
offsetof()-计算成员变量关于起始位置的偏移量-头文件#include<stddef.h>
offsetof()是宏
![](https://i-blog.csdnimg.cn/blog_migrate/35949771a51647d304ff792242d99714.png)
F.结构体传参
![](https://i-blog.csdnimg.cn/blog_migrate/9a64e0f8445afb0add96a49282bba0ae.png)
这里指进行了传值而未传址,所以二者内存地址不同,故对tmp的改变不会影响主函数中的s。
![](https://i-blog.csdnimg.cn/blog_migrate/a9846815fa70b5f3ee9aee4c9177a861.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ba7fa4795380cb8c15454e92fa21111.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c93edfc662180a845d5cfb7bd4cb3475.png)
G.位段(用于节省空间)-
![](https://i-blog.csdnimg.cn/blog_migrate/bd2aee3dbc2bcbd6967eac5dde1f648f.png)
其实long,short,char也行,不过类型通常要相似的,不能一会char,一会int。
![](https://i-blog.csdnimg.cn/blog_migrate/33e2b99dbc3dde987941b9c31ce9cb89.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bd23cc03fb3e2e171c25b34091b7ab31.png)
这里a只要2个比特位,b只要5个比特位,c只要10个比特位,d只要30个比特位。
如果不设置位段这里a是int类型,有32个比特位,有2^32种,但你不需要这么多种
所以设置位段来限制比特位。(位段给的数字要<=32)
![](https://i-blog.csdnimg.cn/blog_migrate/06ccccc52650824bbf8e07138809b660.png)
3.因为C语言未给位段定标准,所以不同编译器对其理解是不同的,如存储是是从左开始存还是右开始存,或是多余的空间是否浪费。
![](https://i-blog.csdnimg.cn/blog_migrate/f3b68874f5cdb55e63e1d397faa6d001.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e2bef11c8793b9e11ea5d3e5ad51c454.png)
![](https://i-blog.csdnimg.cn/blog_migrate/63fce0de7ac4b4a96491546287350f6b.png)
在内存中表示是以十六进制表示的每四个比特位表示一个数所以最后是220304
![](https://i-blog.csdnimg.cn/blog_migrate/62dfbfba66f159cb22023ed35dd86882.png)
![](https://i-blog.csdnimg.cn/blog_migrate/48aea153ce52ed34bc5bdff5c041f782.png)
2.枚举
A.枚举的使用
![](https://i-blog.csdnimg.cn/blog_migrate/a15206cad34c54e9eeb1c2cfd84a2c11.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4c86925211438163133f3461698f9701.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8a7b8ad3a2749f153411f77d8d8fc879.png)
![](https://i-blog.csdnimg.cn/blog_migrate/729b25186bedfcccb813fe0ca9e92d7b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a31d182d2e88bd2ac0dc170e9e68bf87.png)
![](https://i-blog.csdnimg.cn/blog_migrate/56e1dd6c984a2d372ed96325611bdc50.png)
这里虽然可以编译过去但其实是有问题的因为左边的是枚举类型,右边的是int类型。
B.枚举的优点
![](https://i-blog.csdnimg.cn/blog_migrate/83f8b1a7ecdd2f0d50e0a9cd0077f89a.png)
枚举类型的大小一般4字节,不存在对齐这一概念
3.联合(共用体)
![](https://i-blog.csdnimg.cn/blog_migrate/1b2c41b745e884cdb5b77d6883396bc3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3357f2fe6d3d5ab3312edfc89d318127.png)
联合体的成员不能同时使用如果使用c,就不能用i。因为它们内部空间互相干涉。
![](https://i-blog.csdnimg.cn/blog_migrate/ff5c526d6da1ede23369f0e0e8fc04aa.png)
利用联合体判断大小端
![](https://i-blog.csdnimg.cn/blog_migrate/d8c48ec4f4098c871239b2fd4ecff0ba.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e08d098afc1344047c3c7643a391c0b6.png)
数组的对齐数大小是它元素的大小
![](https://i-blog.csdnimg.cn/blog_migrate/cf4397b6980f1a97962d2becd8660da8.png)