【C语言】联合体&&枚举的讲解
目录
小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化!
✨声明!!!:
联合体与结构体只有一个区别,那就是内存存储方式不同
💕1.联合体的声明
联合体的声明与结构体的声明相同
详见的可看文章:【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)-CSDN博客
这里还是再演示一下:
union stu //联合体类型的声明,联合体类型为union stu
{
char c1;
int i;
//联合体的内容
}b1; //创建联合体变量b1
联合体的声明,赋值,使用,访问联合体成员等等都与结构体一模一样,这里不再多做讲解
💕2.联合体内存的存储
在联合体中也是如此,联合体中所有的联合体成员共用一块内存,并且所有联合体内容的内存起始位置都是相同的
什么叫共用同一块内存?图例如下
:
在此图中,联合体内容 c 与联合体内容 i,共用了同一块内存空间,可能还不够直观,我们再利用代码观察一下
我们会发现,低位地址的内容,经过b1.c1 = 0x55执行后,i 变成了0x11223355
这就是因为联合体成员占用的是同一块内存的原因
如果我们将地址打印出来,我们会发现打印出来的地址也是一样的
💕3.联合体字节大小的计算
计算联合体字节的大小,要遵循以下两条规则
1.联合体的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍
例题1如下:
union Un1 { char c[5]; int i; }; printf("%zd", sizeof(union Un1)); //打印8
union U1 开辟了5个字节大小的内存空间,联合体成员最大对齐数为4(i),因此,联合体的字节大小要对齐到最大对齐数的整数倍,即8
过程与结构体字节大小计算完全一样,详见可见这里【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)-CSDN博客
例题2:
union Un2 { short c[7]; int i; }; printf("%zd", sizeof(union Un2)); //打印16
union U2 开辟了14个字节大小的内存空间,联合体成员最大对齐数为4(i),因此,联合体的字节大小要对齐到最大对齐数的整数倍 ,即16
✨4.枚举的声明
生活中的某些取值可以被一一列举出来,把这些取值抽象成一种类型,就是 枚举类型
枚举类型的声明与结构体相似,enum 是枚举类型的关键字
例如星期一,星期二,星期三到星期日这些取值可以被抽象成星期类型
枚举的声明举例:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
需要注意:声明枚举类型的每个取值最后以逗号结尾,但是最后一个的取值不用以任何符号形式结尾
枚举类型的的取值如Mon,Tues,Wed,这些枚举常量都是有默认取值的,枚举类型的第一个常量(取值)默认是0,往下每个常量依次递增
枚举类型的枚举常量对应的值是可以在定义的时候进行修改的,但是不能在定义后进行修改,不然就会报错
可以发现,在改变枚举常量后,往后的枚举常量对应的值是顺着递增的,我们可以在任意内容上对枚举常量对应的值进行修改,如图:
✨5.枚举类型的优点
我们可以使用 #define 定义常量,为什么非要使用枚举?
增加代码的可读性和可维护性
和#define定义的标识符比较枚举有类型检查,更加严谨
便于调试,预处理阶段会删除 #define 定义的符号
使用方便,一次可以定义多个常量
枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
6.C/C++中枚举的不同
在C语言中,可以将 0 赋值给enum Color 类型的 d,而在C++中却不行对比如下:
在C++中,如果想通过以下类型给d赋值,就会失败,因为d是枚举变量,它的类型是enum Color ,而 0 的类型是int 型,在C++中,要求的比较严格,因为类型不匹配所以不能赋值
原文地址:https://blog.csdn.net/2301_80349538/article/details/142147756
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!