自学内容网 自学内容网

【C语言】联合体&&枚举的讲解

d9c25ccd4d724b3493e47f53f297808c.png

目录

✨声明!!!:

联合体与结构体只有一个区别,那就是内存存储方式不同

💕1.联合体的声明

💕2.联合体内存的存储

💕3.联合体字节大小的计算

例题2:

✨4.枚举的声明

✨5.枚举类型的优点 

6.C/C++中枚举的不同 


小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化! 


✨声明!!!:

联合体与结构体只有一个区别,那就是内存存储方式不同


💕1.联合体的声明

联合体的声明与结构体的声明相同

详见的可看文章:【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)-CSDN博客

这里还是再演示一下:

union stu //联合体类型的声明,联合体类型为union stu
{
char c1;
int i;
//联合体的内容
}b1;    //创建联合体变量b1

联合体的声明,赋值,使用,访问联合体成员等等都与结构体一模一样,这里不再多做讲解


💕2.联合体内存的存储

在联合体中也是如此,联合体中所有的联合体成员共用一块内存,并且所有联合体内容的内存起始位置都是相同的

什么叫共用同一块内存?图例如下

3772af6904ee4f729ed65c4362ccb254.jpeg

在此图中,联合体内容 c 与联合体内容 i,共用了同一块内存空间,可能还不够直观,我们再利用代码观察一下

a03a5d8f0a684538af28b76f4482b085.png

我们会发现,低位地址的内容,经过b1.c1 = 0x55执行后,i 变成了0x11223355

这就是因为联合体成员占用的是同一块内存的原因

如果我们将地址打印出来,我们会发现打印出来的地址也是一样的

cdc003f409fb48efb5583a9dd5d35b1b.png


💕3.联合体字节大小的计算

计算联合体字节的大小,要遵循以下两条规则

1.联合体的大小至少是最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍

例题1如下:

union Un1 {
char c[5];
int i;
};

printf("%zd", sizeof(union Un1));
//打印8

union U1 开辟了5个字节大小的内存空间,联合体成员最大对齐数为4(i),因此,联合体的字节大小要对齐到最大对齐数的整数倍,即8 

d3a1535c76a34d9799d64a53c5f63b3a.jpeg

过程与结构体字节大小计算完全一样,详见可见这里【C语言】结构体超详细全讲解 (代码+万字文字+画图讲解)-CSDN博客


例题2:

union Un2 {
short c[7];
int i;
};

printf("%zd", sizeof(union Un2));
//打印16

union U2 开辟了14个字节大小的内存空间,联合体成员最大对齐数为4(i),因此,联合体的字节大小要对齐到最大对齐数的整数倍 ,即16

ce0b25b0c87448a9a07517778d6fdb6e.jpeg


✨4.枚举的声明

生活中的某些取值可以被一一列举出来,把这些取值抽象成一种类型,就是 枚举类型

枚举类型的声明与结构体相似,enum 是枚举类型的关键字

例如星期一,星期二,星期三到星期日这些取值可以被抽象成星期类型

枚举的声明举例:

enum Day//星期
{
    Mon,
    Tues,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun
};
 
enum Color//颜⾊
{
    RED,
    GREEN,
    BLUE
};

需要注意:声明枚举类型的每个取值最后以逗号结尾,但是最后一个的取值不用以任何符号形式结尾

枚举类型的的取值如Mon,Tues,Wed,这些枚举常量都是有默认取值的,枚举类型的第一个常量(取值)默认是0,往下每个常量依次递增

11deea09043f4ea0ab93ce0d2445e9c0.png

枚举类型的枚举常量对应的值是可以在定义的时候进行修改的,但是不能在定义后进行修改,不然就会报错

4826954edbef4229ba0462b1377168cd.png

可以发现,在改变枚举常量后,往后的枚举常量对应的值是顺着递增的,我们可以在任意内容上对枚举常量对应的值进行修改,如图:

42e338f90b5046fca4aec57ed92ba9eb.png


✨5.枚举类型的优点 

我们可以使用 #define 定义常量,为什么非要使用枚举?

增加代码的可读性和可维护性
和#define定义的标识符比较枚举有类型检查,更加严谨
便于调试,预处理阶段会删除 #define 定义的符号
使用方便,一次可以定义多个常量
枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用


6.C/C++中枚举的不同 

在C语言中,可以将 0 赋值给enum Color 类型的 d,而在C++中却不行对比如下:

 0b749e25fab24438a9e99cbb4e330b38.png            


在C++中,如果想通过以下类型给d赋值,就会失败,因为d是枚举变量,它的类型是enum Color ,而 0 的类型是int 型,在C++中,要求的比较严格,因为类型不匹配所以不能赋值

2d7fbd18d3594b50a8aa4eb4f557108e.png

 8fdd48caf53e46a897fd8a5554dbb454.png


原文地址:https://blog.csdn.net/2301_80349538/article/details/142147756

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!