自定义类型:结构体,枚举,联合
结构体
- 结构体声明
struct tag
{
member_list;
}variable_list;
例如:定义一个学生结构体
struct Stu
{
char name[20]; //姓名
int age; //年龄
char sex[5]; //性别
char id[20]; //学号
};
- 结构体内存对齐
计算结构体大小,对齐规则:
-
第一个成员在与结构体变量偏移量为0的地址处
-
其他变量成员要对齐到对齐数的整数倍地址处
(对齐数:编译器默认的对齐数与该成员大小的较小值)
-
结构体总大小为最大对齐数(每个成员变量都有自己的一个对齐数)的整数倍
-
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
- 内存对齐的原因
结构体 的内存对齐是拿空间换时间的做法
位段
- 位段的声明
位段成员必须是int, unsigned, int, signed int
位段的成员名后有一个冒号和一个数字
- 位段内存分配
位段在空间上按照需要以四个字节(int)或者一个字节(char)方式来开辟
举例:
枚举
- 枚举定义
举例:
enum Day
{
Mon, //如果没赋初值,默认从0开始,依次增加1
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
联合(共用体)
- 联合体的成员公用同一块空间
举例:
union Un
{
int i;
char c;
};
union Un un;
int main()
{
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
}
联合体的大小:
- 至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍时,就对齐到最大对齐数是整数倍