目录
联合体
联合体是什么?
联合体的大小计算
枚举
枚举是什么?
为什么要使用枚举?
联合体
联合体是什么?
联合体也是个自定义类型,它和结构体类似,都是由多个成员构成,可以有不同的内置类型
但它们是有区别的
联合体之所以叫联合体,是因为它里面的成员会重复使用一块内存空间
所以联合体也叫共用体
union Un
{char c;int i;
};
union Un是创建的联合体类型
大括号里面的是联合体成员
最后要加个分号不能忘记
联合体的大小计算
这里的char c 是会和 int i 共用一块空间的,如图
所以我们最终如果打印这个联合体的大小
#include<stdio.h>union Un
{char c;int i;
};int main()
{printf("%zd", sizeof(union Un));return 0;
}
联合体计算方法:
1. 联合体的大小至少是最大成员的大小
2. 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
方法和上一章的结构体计算差不多,但联合体相对较简单
例如:
#include<stdio.h>union Un
{short c[7];int i;
};int main()
{printf("%zd", sizeof(union Un));return 0;
}
根据上面的计算方法1
short为2个字节,int为4个字节
最大成员为c[7],大小为2*7=14个字节
所以联合体的大小至少是最大成员14个字节的大小
根据上面的计算方法2
要调整到最大对齐数的整数倍,这里不难看出最大对齐数为4
所以答案应该是16个字节
如果不会算最大对齐数可以看看我上一章结构体对齐规则
C语言:自定义类型:结构体-CSDN博客
枚举
枚举是什么?
枚举其实就是全部列举
例如:
enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Day是创建的枚举类型
大括号里面是成员,会自动赋值从0开始
最后的分号也不能忘记
所以Mon是0,Tues是1......Sun是6
所以这样明显是不正确的,Mon不是应该是1吗?
所以我们是可以改的
enum Day
{Mon = 1,Tues,Wed,Thur,Fri,Sat,Sun
};
这样就会默认从1开始一直往下赋值
这样我们就可以在枚举作用的范围内直接使用它的成员作为值了,跟宏定义类似
为什么要使用枚举?
1. 增加代码的可读性,相比数字来说使用文字能更让人读得懂代码的含义
2. 与#define相比它拥有类型检查,更加严谨
3. 便于调试,若#define会在预处理阶段就删除#define定义的符号
4. 使用方便,可以一次定义多个常量
5. 遵循作用域,枚举若只声明在函数内,则只能在函数内部使用
完