结构体
结构体类型的创建
结构体的格式:
struct 结构名
{成员列表}
变量名;
结构体创建时分为有名结构体和无名结构体。
有名结构体
struct str
{
char name[20];
int id;
int age;
};
struct stu peopleinfo
无名结构体
struct
{
char name[20];
int id[8];
int age;
}peopleinfo;
结构体的初始化
结构体的初始化就是确定一些变量的同时并且赋值
ep:
struct stu
{
char name[20];
char id[10];
int age;
};
struct stu peopleinfo = {"zhangsan","2303030",20};
//这就是结构体的初始化
结构体的内存对齐
在这了我们要深入讨论一个问题:计算结构体的大小,这就关系到结构体的内存对齐问题。
结构体的对齐规则
1,第一个成员在与结构体变量的偏移量为0的地址处。
2,其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数=编译器默认的一个对齐数 与该成员大小的较小值。vs中的默认值为8,linux中的默认值为4.
3,结构体的总大小为最大对齐数(每个成员变量的都有一个对齐数)的整数倍。
4,如果有结构体嵌套的情况,嵌套的结构体对齐到自己的最大对齐数的 整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。
er:
struct s1
{
char a1;
int i;
char a2;
};
printf("%d\n",sizeof(struct s1));
位段
位段的声明和结构体是类似的,但是有两处不同:
1,位段的成员必须是int,unsigned or signed int.
2,位段的成员后边有有一个冒号和一个数字。
ep:
struct a
{
int b:2;
int c:5;
int d:10;
int e:30:
};
这个结构体的大小的是7个字节
枚举
枚举的就是一一列举,把可能的值一一列举出来
ep:
enum sex
{
male,
female,
secret,
}
枚举在没有特殊赋值时,maled的值为0,后面一次递增
接下来说一下枚举的优点
1,增强代码的可读性和可维护性
2,和define定义的标识符比较,枚举有类型检查,更严谨。
3,防止了命名污染。
4,便于调试
5,使用方便,一次可以定义多个变量。
联合
联合也是一种特殊的自定义类型,联合的成员是共用一块空间的,这样一个联合变量的大小,至少是最大成员的大小。
联合大小的计算:
1,联合的大小至少是最大成员的大小。
2,当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍处。
ep:
union un
{
char c[3];
int a;
};
union un1
{
short c[8];
int b;
};