C语言复合结构类型总结

复合结构类型:
结构

​ 结构是由程序员自己设计的一种数据类型,用于描述一个事物的的各项数据,由若干个不同的基础类型组成。

设计:

​ struct 结构体名

​ {

​ 类型1 成员名1;

​ 类型2 成员名2;

​ …

​ };

定义结构变量:

​ struct 结构体名 结构变量名;

​ 注意:定义结构体变量时,struct不能省略

定义结构变量初始化:

​ struct 结构名 结构变量名 = {v1,v2,v3};

​ 注意:要根据结构体设计的顺序初始化

​ struct 结构名 结构变量名={.成员名=v2,.成员名=v3};

​ 只初始化某些成员

​ 注意:同类型的结构变量可以直接赋值 变量名1=变量名2

​ 访问结构成员:结构体名.成员名;

typedef重定义结构类型:

​ typedef struct 结构类型名 结构类型名;

​ 之后就可以不使用struct关键字了

​ typedef struct 结构类型名

​ {

​ 类型 成员名;

​ …

​ }结构类型名;

​ 注意:一般使用堆内存存放结构体变量

如何计算结构体的字节数:

​ 结构体的成员的顺序会影响它的总字节数,如果在设计结构体时能够合理地安排成员的顺序可以大大节省内存。

​ 内存对齐:

​ 假定第一个成员从零地址开始,储存每个成员地址编号必须能被它的字节数整数,如果不能整除则填充空字节。

​ 内存补齐:

​ 结构体的总字节数,必须是它最大成员的字节数的整数倍,如果不是整数倍则在末尾填充空字节。

​ 在Linux系统下计算结构体的对齐和补齐时,如果成员的字节数超过4字节则按4字节算。Windows下是按实际情况计算

​ #pragma pack(n) 设置补齐、对齐的最大字节数 n<=4

联合:union

​ 联合与结构的使用方法基本一致,与结构的区别就是所有的成员共用一块内存,一个成员的值发生变化,其他所有成员的值也会随着改变。

​ 联合就是使用少量的内存对应多个标识符,来达到节约内存的目的,现在已经基本不使用了。

​ 联合常考的笔试题:

​ union Date

​ {

​ char ch[10];

​ int num=0x01020304;

​ };

​ 注意:计算联合体时要考虑内存补齐。

​ 如何判断系统是大端还是小端?

​ 如果十六进制整数0x01020304 储存在以0x0A为起始地址的4字节内存中。

​ 高位数据存储在高位地址(0A:04 0B:03 0C:02 0D:01)————小端

​ 高位数据储存在低位地址(0A:01 0B:02 0C:03 0D:04)————大端

​ 个人计算机系统一般都是小端系统,而UNIX服务器和网络设备都是大端系统,网络字节序也是大端模式的数据

​ 序列化和反序列化(sprintf、xml、json)

枚举:enum

​ 枚举就是一种数据类型把可能出现的值全部罗列出来,取一个有意义的名字,除此之外,该类型的变量再出现别的数值就是非法的(愿望)。

​ 枚举可以看做是值受限的int类型,但编译器为了效率并不会检查,所有的C语言中枚举都可以当做int类型变量使用。

​ 锦上添花

​ enum Direction

​ {

​ UP=183,

​ DOWN=184,

​ RIGHT=185,

​ LEFT=186

​ };

​ 如果不给成员值,枚举的值默认从0开始,逐渐+1,如果设置了值,后面没设置的会在它的基础上+1

​ 为什么要使用枚举:

​ 为没有意义的值取一个有意义的名字,提高代码的可读性,和安全性

复习:

结构:结构是由程序员自己设计的一种数据类型,用于描述一个事物的各项数据,由若干个基础的数据类型组成。

设计:

struct 结构类型名

{

​ 基础类型 成员名;

​ …

};

定义结构变量:

struct 结构类型名 结构变量;

注意:也可以在设计时直接定义结构变量

注意:一般结构类型名首字母大写,结构变量一般小写

访问成员:

​ 结构变量:结构变量名.成员名

​ 结构指针:结构指针名->成员名

初始化:

​ 顺序:struct 结构类型名 结构变量名 = {v1,v2,v3…};

​ 指定:struct 结构类型名 结构变量名 = {.成员名2=v2,.成员名4=v4};

类型重定义:

​ 在C语言中,struct、union、enum 的关键词是不能省略的

​ typedef struct 结构类型名 结构类型名;

​ typedef struct 结构类型名

​ {

​ 类型 成员名;

​ …

​ }结构类型名;

计算字节数:

​ 成员的顺序不同会影响结构体的总字节数,成员的位置顺序徐如果能够合理安排可以大大节约内存。

​ 对齐:假定从0地址开始,每个成员使用的内存的地址编号,必须被它的字节数整除,如果不能满足则填充一些闲置的字节。

​ 补齐:结构体的总字节数必须是它最大成员的字节数的整数倍,如果不能满足则在末尾填充一些闲置的字节。

​ 注意:计算对齐、补齐时,在Linux 32位系统下,超过4字节的按照4字节计算。

联合:所有成员共用一块内存,也就说所有成员都是从一个内存起始位开始使用内存,一个成员发生变化后,其余成员也会随着改变,语法与结构基本一致。

​ 早期使用联合是为了节约内存,现在已经基本不在使用。

​ 注意:联合天然就是对齐的,但是要考虑补齐。

​ union data

​ {

​ char str[5];

​ int num;

​ }

​ 总字节数:8

​ 也可以借助联合判断系统是大端、小端:

​ 小端:低位数据储存在地位地址

​ 大端:低位数据储存在高位地址

​ 一般个人计算机系统都是小端,大型服务器和网络设备都是大端,大端字节序也叫做网络字节序

枚举:把一个整型变量可能出现的所有值罗列出来,除此之外的其它值都是非法的(愿望)

​ enum 枚举名{枚举常量1,枚举常量2,枚举常量3…};

​ 枚举变量就相当于值受限的int类型变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值