
目录一.结构体的定义二.结构体的定义与声明1.常规方法2.匿名结构体3.嵌套结构体三.结构体的赋值1.定义时赋值初始化2.定义后逐个赋值四.结构体成员访问1.点操作符访问2.通过成员访问操作符访问五.结构体内存对齐1.为什么要内存对齐2.内存对齐规则一.结构体的定义1.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。2.结构体和其他类型基础数据类型一样即与数组整型int字符型插入等类型同级别。3结构体关键字struct 。二.结构体的定义与声明1.常规方法示例struct student { char name[20]; int age; char sex[20]; }; struct student a;这里我们定义了一个类型名为student 含有一个名为 name 字符型数组变量、 age 的整型变量 sex 的字符型数组变量 的结构体并成功声明student类型变量 a 。2.匿名结构体示例struct { char name[20]; int age; char sex[20]; }student;顾名思义我们定义的是一个没有类型名的结构体变量类型并同时声明了一个该类型的变量 student。注由此方式创建的结构体只能在定义时声明变量在定义之后无法再次声明变量。3.嵌套结构体嵌套可理解为镶嵌、套用。指在已有的表格、图像或图层中再加进去一个或多个表格、图像或图层亦或两个物体有装配关系时将一个物体嵌入另一物体的方法。嵌套结构体即将一个结构体嵌套进另一个结构体中。示例struct data { int year; int month; int day; }; struct student { char name[20]; int age; struct data da; }这里定义的结构体 student 中有另一个结构体 data 这就是结构体的嵌套。注结构体包含自身时便是结构体的自引用结构体需要自引用时选择指针的形式否则将无法为其分配内存空间。三.结构体的赋值1.定义时赋值初始化示例struct student { char name[20]; int age; char number[12]; }; int main() { struct student stu { 张三,18,11111111111 }; return 0; }打开监视器我们可以发现数据已经在变量声明的时候储存进去了。2.定义后逐个赋值示例struct student { char name[20]; int age; char number[12]; }; int main() { struct student stu; stu.age 18; sprintf_s(stu.name,张三); sprintf_s(stu.number, 11111111111); return 0; }由于时数据声明后挨个赋值所以无所谓赋值顺序了。四.结构体成员访问1.点操作符访问示例#includestdio.h struct student { char name[20]; int age; char number[12]; }; int main() { struct student stu { 张三, 18, 11111111111}; printf(名字%s,\n年龄%d,\n电话号码:%s, stu.name, stu.age,stu.number); return 0; }运行结果如下2.通过成员访问操作符访问注成员访问操作符的作用对象时指针。示例struct student { char name[20]; int age; char number[12]; }; int main() { struct student stu { 张三, 18, 11111111111}; struct student* pstu stu; printf(名字%s,\n年龄%d,\n电话号码:%s, pstu-name, pstu-age,pstu-number); return 0; }运行结果如下所示五.结构体内存对齐1.为什么要内存对齐a.硬件平台不一定能随意访问某个地址上的任意数据b.为了访问未对齐的内存处理器需要作两次内存访问而对齐的内存访问仅需要一次访问。为了提高效率需要进行内存对齐。2.内存对齐规则a.先进行结构体各成员对齐再进行结构体总对齐。b.结构体的第一个数据成员存放的地址为结构体变量偏移量为0的地址处即结构体起始位置。从第二个成员开始各成员自要对齐到该成员大小与默认对齐数中最小值的整数倍的偏移量处。结构体的大小为其最大成员大小的整数倍处。示例struct student { int a; short b; char c; };对于这个结构体首先进行结构体成员对齐第一个成员为整型数据大小为四字节所占内存为1234以结构体起始位置为1第二个成员为短整型数据大小为二字节对齐到偏移量为 4 的位置即第二个成员所占内存为 56。第三个成员为字符型数据大小为一字节对齐到偏移量为7。然后进行结构体总对齐易知该结构体中最大的数据为整型数据大小为4对齐后偏移量为8。由此可知该结构体的大小为8字节。具体大小我们可以通过运行代码验证#includestdio.h struct student { int a; short b; char c; }; int main() { printf(%zd, sizeof(student)); return 0; }运行结果如下