结构:
??结构是一种由程序员自己设计的数据类型,用于描述一个事物的各项数据,由若干个不同的基础类型组成
?设计: ?struct 结构体名 ?{ ??/* data基础类型 / ??/类型1 成员名1;/ ??/ … */ ?}; ?定义结构变量: ??struct 结构体名 变量名; ??注意:在定义结构变量时,struct不能省略
结构体变量的初始化:
1. struct 结构体名 变量名 = {v1,v2,v3...}
注意:必须要根据成员设计的顺序初始化
2. struct 结构体名 变量名 = {.成员名2=v2,.成员名5=v5...}
只初始化某些成员,可以不用按照顺序初始化
3.注意:同类型的结构体变量可以直接给结构体变量初始化,赋值
访问成员:
结构变量名.成员名
结构指针->成员名
结构变量作为形参时:
由于结构变量的字节数都比较大,值传递的效率比较低,因此都是传递结构变量的地址,如果不需要修改结构变量的值,可以使用const保护
练习1:设计一个教师结构体,成员有姓名、性别、工号、工龄,定义一个教师结构体变量,使用scanf输入各个成员的值并显示出来。 struct Teacher tch[5]; tch[0].name…
typedef重定义结构体类型:
typedef struct 结构体名 结构体名;
之后就可以不用struct关键字来定义结构体变量;
typedef struct 结构体名
{
/* data */
}结构体名;
之后就可以不用struct关键字来定义结构体变量;
注意:一般结构体变量存放在堆内存中
如何计算结构体的字节数: 结构体成员的顺序会影响它的总字节数,如果能够在设计结构体时合理安排成员顺序,可以大大节约内存 内存对齐: 假定第一个成员是从零地址开始,存储每个成员的地址编号必须满足能被该成员的字节数整除,如果不能则填充空白字节 内存补齐: 结构体的总字节数,必须是它最大成员类型的字节数的整数倍,如果不是则在末尾填充空白字节 注意:在Linux系统下计算结构体的对齐与补齐时,如果成员的字节数超过4字节,则按照4字节计算;在Windows下,是按照实际情况计算
??#pragma pack(n) 设置对齐、补齐的最大字节数, n<=默认4(1 2 4)
联合: union 联合体 { /* data */ }; 联合与结构的使用方法基本一致,与结构的区别是所有成员公用一块内存,一个成员的发生改变,其他成员也会随之改变 联合就是使用少量的内存对应多个标识符,来达到节约内存的目的,现在基本上不再使用了
联合常考的笔试题:
?union Data ?{ ??char ch[5]; ??int num; ?};// 字节数是8 ?注意:计算联合的字节数要考虑内存补齐,联合天然是内存对齐
如何判断操作系统的大小端?
什么是大小端? ?假如十六进制整数0x01020304存储在以0x0A起始的四个字节内存中 ?高位数据存储在高位地址:(0x0A:04 0x0B:03 0x0C:02 0x0D:01)小端系统 ?高位数据存储在低位地址:(0x0A:01 0x0B:02 0x0C:03 0x0D:04)大端系统 ?结合联合实现: ??…/day15/test2.c ?个人计算机一般都是小端系统,而UNIX服务器和网络设备都是大端系统,本地字节序是小端模式,网络字节序是大端模式 ?序列化和反序列化(JSON\xml)
枚举:enum ?枚举就是把一种数据类型可能出现的所有值全部罗列出来,取一个有意义的名字,除此之外的数据,如果赋值给该枚举变量就是非法的(愿望) ?枚举可以看做是指受限的int类型,但c编译器为了效率不会检查,所以C语言的枚举变量可以当成int类型变量使用,一般会直接使用起好名字的枚举成员。(锦上添花)
- ?enum Direction
?{ ??UP = 183, ??RIGHT = 185, ??LEFT = 186, }; - enum Direction {UP,DOWN,RIGHT,LEFT};
如果不给成员值,枚举常量默认从0开始,依次+1,如果某个设置了值,后面的会在该值的基础上逐渐+1
为什么要使用枚举?
??为无意义的数值起一个有意义的名字,提高了代码的可读性,并且有相对较高的安全性
作业:使用结构体完成通讯录
|