结构
(一般结构体变量存放在堆内存中)
struct 结构体名
{
类型1 成员名1;
类型2 成员名2;
...
};
初始化方法:
struct 结构体名 变量名 = {v1,v2,v3...};
注意:必须要根据成员设计的数据初始化
struct 结构体名 变量名 = {.成员名1=v1,.成员名3=v3,...};
只初始化某些成员,可以不用按照顺序初始化
注意:同类型的结构体变量可以直接给结构体变量初始化、赋值
访问成员:
结构变量名.成员名
结构指针->成员名
typedef重定义结构体类型:
方式1:
typedef struct 结构体名 结构体名;
方式2:
typedef struct 结构体名
{
...
}结构体名;
之后就可以不使用struct关键字来定义结构体变量
如何计算结构体的字节数:
结构体成员的顺序会影响它的总字节数,如果能够在设计结构体时,合理安排成员顺序可以大大节约内存
内存对齐:
假定第一个成员是从零地址开始,存储每个成员的地址编号必须满足能被该成员的字节数整除,如果不能整除则填充空白字节
内存补齐:
结构体的总字节数,必须是它最大成员的字节数的整数倍,如果不是则在末尾填充空白字节
在Linux系统下计算结构体的对齐、补齐时,如果成员的字节数超过了4字节,则按照4字节计算(windows系统是按照实际情况计算)
联合
与结构区别是所有成员共用一块内存,一个成员的值发生改变,其他成员也随之改变
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)大端系统
个人计算机系统一般都是小端系统,而UNIX服务器和网络设备都是大端系统,本地字节序是小端模式,网络字节序是大端模式
枚举
枚举就是把一种数据类型可能出现的所有值全部罗列出来,取一个有意义的名字,除此之外的数据,如果赋值给该枚举变量就是非法的(但C语言为了速度并不做警告)
enum direction
{
UP = 183,
DOWN = 184,
RIGHT = 185,
LEFT = 186,
};
如果不给成员值,枚举常量的值默认从0开始,依次+1,如果某个设置了值,后面的会在该值的基础上逐渐+1
使用枚举原因:
为无意义的数值起一个有意义的名字,提高代码的可读性,并且有相对较高的安全性