一、结构体的创建
1、创建结构体的关键字。
struct。
2、创建结构体公式:
struct + student(自定义名称,也可匿名定义)
{
//成员变量
char name[10];
int age;
}stu(在这里可以直接定义一个或多个结构体变量);
3、结构体初始化
初始化在main函数中进行:
int main()
{
//通过已经定义好的变量进行初始化
student.stu = {"zhangsan",20};
//通过在main方法中创建变量进行初始化
struct student stu2 = {"lisi",21};
}
4、结构体的自引用
struct + student(自定义名称,也可匿名定义)
{
//成员变量
char name[10];
int age;
//添加自引用,切记只能通过地址进行引用
struct student *next;
}stu(在这里可以直接定义一个或多个结构体变量);
二、结构体中的内存对齐(本次重点)
1、什么是内存对齐?
即数据在结构体内存中存储时,按照特定的值存入内存的过程
2、内存对齐的规则
(1)结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
(2)其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
ps:对齐数= 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。
(3)结构体的总大小是最大对齐数的整倍数
(4)如果结构体中嵌套了结构体,嵌套的结构体成员对齐到自己的成员中最大对齐数的整倍数处,结构体的大小就是所有最大对齐数的整倍数。
3、结构体内存对齐是为了什么?
主要原因就是为了以空间换时间。
我们来看以下代码:
struct S1
{
char c1;
int i;
char c2;
};
这里的数据所占用的字节数是多少呢?
char占一个字节,int占四个字节,是不是6个字节呢?画图并结合上面的规则来给大家说明:
它的实际占用数就是12个字节,从第一个开始占用1+3,第二个占用4,第三个占用1,最终大小要和等于最大对齐数的整倍数+3。
接下来我们看一下存在嵌套问题的怎么处理:
在S3中,总站用16个字节,对齐数为最大对齐数的整倍数,最大对齐数是8,在这里它从8开始向后占用16个字节,d是double类型,同样占用8个字节,从24向后占用8个字节,总大小为32个字节,符合所有规则。