引言:前面我们知道C语言中的数据类型分为内置类型和自定义类型。简述一下,内置类型就是字符型(c),整形(d),浮点型(f),布尔类型(bool)这些;自定义类型有结构体,联合体,和枚举。下面介绍结构体。
定义:试想一下,我们可以用字符,数字来表示生活中的各项数据,那么对于一位学生,我们要如何表示呢。这是我们就需要引入一个类似集合的概念,用其中的每个元素来表示学生身高、体重、学号等等。这个集合就相当于是结构体,里面的元素就相当于成员变量。而每次生成一个学生个体集合就相当于利用结构体类型生成了一个结构体类型变量(类型->创建变量)。
语法:picture1
匿名结构体:有时候,我们不想实名该学生,但又不得不列出其各项数据,所以我们引入匿名结构体的概念。
语法:picture
结构体的存储:
有了结构体类型并且生成变量之后,我们就需要将它存储在计算机中。我们知道,结构体是由许多不同类型的成员变量所组成,存储它们,自然也就存储了结构体。这就需要一个存储法则,来使我们在不同的环境中存储并且读取。
结构体的内存对齐法则:
1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。VS 中默认的值为 8 Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
举例:
答案是64;
Tips:具体为什么要有结构体内存对齐这一说呢,你可以理解为你的步长是一个数X,当你想在一条路的不同位置获取资源时,你不需要调整自己的步长,只需增加或者减少自己的步数即可。事实上,计算机就是这么遍历数据的,而当以固定遍历长度读取时,计算机效率会高一些。这就是计算机中以空间换取时间的思想。因为你在内存对齐的时候,不可避免的,会浪费一些内存空间。
设置默认对齐数:#pragma pack(1)
恢复默认对齐数#pragma pack ()