目录
1.结构体
1.1结构体的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2 结构的声明
一般形式:
struct 结构体名
{成员变量};
接下来,我们创建一个学生的结构体
记得要有分号。
1.3:结构体的声明
struct student
{
char name[10];//名字
char sex[5];//性别
int age;//年龄
int number//学号
}p1,p2;//声明p1,p2 学生-----第一种方法声明
int main()
{
struct student s1;//第二种方法声明,
}
1.4:结构的自引用
1.5 结构体变量的初始化
struct student
{
char name[15];//名字
char sex[10];//姓名
int age;//年龄
char add[20];//地址
}s1 = { "zhangsan","nan",20,"xian" };//第一种方法初始化
int main()
{
struct student s1 = { "wangming","nu",18,"henan" };//第二种方法初始化
}
1.6:结构体的内存对齐
这是一个热门考点:结构体内存对齐:
如何计算?
首先得掌握结构体的对齐规则:
1,第一个成员在与结构体变量偏移量为0的地址处。
2,其他成员要对齐到莫个数字对齐数(编译器默认的一个对齐数与该成员大小的较小值)的整数倍的地址处。
3,结构体总大小为最大对齐数的整数倍。
既然知道规则了,那我们来试一试一道题,看看自己算对了没。
这道题你们算对了吗?这道题可以检测出来,自己算对了吗,那就是offsetof 函数。
1.7:offsetof函数
offsetof这个函数的头文件#include<stddf.h>
(type,member)这个是结构体的成员属性。
1.7.1:offsetof函数的用例
struct s3
{
double d;
char c;
int i;
};
int main()
{
printf("%d\n", sizeof(struct s3));
printf("%d\n", (int)offsetof(struct s3,d));
printf("%d\n", (int)offsetof(struct s3, c));
printf("%d\n", (int)offsetof(struct s3, i));
return 0;
}
2.位段
2.1:位端的定义
注意:
1.位端成员必须是int ,unsigned, int 或signed int.
2.位端的成员名后边有一个冒号和一个数字。
2.2:位端的用例
位端的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟。
位端是不跨平台的。
3.枚举
3.1:枚举类型的定义
从这里看:默认从零开始,依次递增1,
3.2:枚举的优点
1.增加代码的可读性和可维护性
2.防止命名污染。
3.使用方便,一次可以定义多个变量。
4.便于调试。
4.联合
4.1:联合的定义
这些成员公用同一块空间
4.2:联合的特点
联合的成员是共用同一块内存空间,这样一个联合变量的大小,至少是最大成员的大小。
4.3:联合大小的计算
1.联合大小至少是最大成员的大小。
2.当最大成员的大小不是最大对齐数的倍数的时候,就要对齐到最大对齐数的整数倍。