🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊
🎉创作不易,请多多支持🎉
🌈感谢大家的阅读、点赞、收藏和关注💕
🌹如有问题,欢迎指正
目录👑
🌟一、联合体(共用体)
🌙1、声明
🌙2、特点
🌙3、大小计算
🌟二、枚举类型
🌙1、声明
🌙2、优点
🌙3、使用
🌟一、联合体(共用体)
🌙1、声明
联合体和结构体一样可以有多个成员,成员类型可以不同。
联合体所有成员共用一块空间,所以联合体又叫 共用体
一个联合变量的大小至少是最大成员的大小
在声明上,联合体和结构体类似,只是把struct关键字换成了union关键字。
给联合体一个成员赋值,其他成员的值也会跟着变化
#include//联合类型的声明 union Un { char c; int i; }; int main() { //联合变量的定义 union Un un = { 0 }; //计算连个变量的⼤⼩ printf("%d\n", sizeof(un)); return 0; }
这里结果为4,因为这里int最大,占四个字节
🌙2、特点
代码1
#include//联合类型的声明 union Un { char c; int i; }; int main() { //联合变量的定义 union Un un = { 0 }; // 下⾯输出的结果是⼀样的吗? printf("%p\n", &(un.i)); printf("%p\n", &(un.c)); printf("%p\n", &un); return 0; }
运行结果
可以看到这三个地址是一模一样的
代码2
#include//联合类型的声明 union Un { char c; int i; }; int main() { //联合变量的定义 union Un un = { 0 }; un.i = 0x11223344; un.c = 0x55; printf("%x\n", un.i); return 0; }
运行结果
可以看到结果不是11223344,第四个字节内容44被换成了55
🌙3、大小计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
(这里最大对齐数和结构体中一样,
可以参考轻松拿捏C语言——自定义类型之【结构体】-CSDN博客)
举例:
#includeunion Un1 { char c[5]; int i; }; union Un2 { short c[7]; int i; }; int main() { printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2)); return 0; }
结果为8和16。
你对了吗?
在union Un1中成员有两个,char c[5]占5个字节大小,在vs中1<8,所以char的对齐数为1,int i占4个字节大小,在vs中4<8,所以int类型对齐数为4, 所以在union Un1中最大对齐数为4。
最大成员大小为5,5不是最大对齐系数4的倍数,所以对齐到8
在union Un2同理。
用联合体判断大小端字节序
int check_sys() { union { int i; char c; }un; un.i = 1; return un.c;//返回1是⼩端,返回0是⼤端 }
🌟二、枚举类型
🌙1、声明
枚举就是一 一列举,
比如列举性别有男女,列举月份有1~12月,列举一周有7天
枚举类型关键字enum
星期:
enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun };
性别:
enum Sex//性别 { MALE, FEMALE, SECRET };
这里的enum Day , enum Sex都是自定义的枚举类型
{ }中的内容就是枚举类型的可能取值,也叫 枚举常量
这些枚举常量是有值的,默认从0开始递增,但也可以在声明的赋初值
enum Color//颜⾊ { RED=2, GREEN=4, BLUE=8 };
🌙2、优点
我们可以用#define 定义常量,为什么非要用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使用方便,一次可以定义多个常量
5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
🌙3、使用
使用枚举常量给枚举变量赋值
enum Color//颜⾊ { RED=1, GREEN=2, BLUE=4 }; enum Color clr = GREEN;
在C语言中可以给枚举变量赋值,比如 enum Color clr = 5;但不推荐这样
但在C++中这样是不行的
🎉🎉🎉本文内容结束啦,希望各位大佬多多指教!
🌹🌹感谢大家三连支持
💕敬请期待下篇文章吧~🥰
还没有评论,来说两句吧...