网站快速优化排名排名,青岛关键词排名哪家好,物业公司取名字大全免费,网站开发终止协议书本章概述 联合体类型的声明联合体的特点联合体的大小的计算枚举类型的声明枚举类型的优点枚举类型的使用枚举类型的大小彩蛋时刻#xff01;#xff01;#xff01; 联合体类型的声明
概述#xff1a;联合体的关键字为 union。它的结构和结构体是一样的。进行展示#xf… 本章概述 联合体类型的声明联合体的特点联合体的大小的计算枚举类型的声明枚举类型的优点枚举类型的使用枚举类型的大小彩蛋时刻 联合体类型的声明
概述联合体的关键字为 union。它的结构和结构体是一样的。进行展示
union tag
{mem_list;
}var_list;联合体的结构成员列表访问方式和定义变量与结构体是一样的在这里不再过多的陈述。但是它俩唯一的区别就是——编译器只为联合体中最大的成员变量分配足够的空间。 也就是说一个联合体的大小至少是最大成员变量的大小其它所有的较小成员就和最大成员共用一个内存空间。事实如此吗进行代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
//联合体的声明
union Un
{char c;int i;
};
int main()
{union Un s {0};printf(%p\n,s);printf(%p\n, (s.c));printf(%p\n, (s.i));return 0;
}结果运行图 我们发现联合体变量的起始地址和内部成员的地址是一样的看来就是共用一个空间。如图所示 这就和结构体有很大的区别。结构体的每个成员都有独立空间但是联合体的所有成员共用一个空间。因此联合体也叫共用体。进行代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
//联合体的声明
union Un
{char c;int i;
};
int main()
{printf(%zd\n,sizeof(union Un));return 0;
}
结果运行图 char c占有1个字节int i 占有4个字节。咱们在上面讲过了编译器只为联合体中最大的成员分配足够的空间所以这个结构体的大小就是4个字节。
联合体的特点
前面咱们讲过了联合体中所有的成员共用一个空间。如图所示 讲到这里可能就有疑问了竟然所有的成员共用一个空间那么改其中一个成员的数据就会导致其它成员的数据改变事实是这样的吗我们就以上面的代码进行调试一下
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
//联合体的声明
union Un
{char c;int i;
};
int main()
{union Un s {0};s.i 0x11223344;s.c 0;return 0;
}内存调试图 事实就是如此——互相影响。所以当我们要用联合体时我们只能用其中一个成员影响到其它成员时也可以使用不止一个不影响其它成员时。讲到这里可能有人就抱怨了联合体竟然这么鸡肋为什么还要用它呢这就是你的格局没打开了。联合体的特点就是所有的成员共用一个空间这不就省内存空间了吗。我们接下来举个生活中的例子进行代码实现
比如我们要搞一个促销活动促销的产品有杯子书本和衬衫。
它们共同有的特征是库存量和价格。
它们各自的特征 杯子 书本 衬衫设计 作者 设计书名 大小页数 颜色当我们想把这些商品进行展示就要把这些特征全部包含进去。我们下意识就会想到结构体写的代码如下
struct git_list
{int kucun;double price;//杯子char sheji[20];//书本char zuozhe[30];char shuming[40];int yeshu;//衬衫int size;char color[10];
};但是当我们用这个结构体创建变量的时候比如struct git_list book 或者 struct git_list mark。有些特征我们是使用不到的。但是内存也要为这些没用到的特征创建空间这就很浪费空间了。这个时候用联合体就会节省很大的空间了进行代码展示
struct git_list
{//共有的特征int kucun;double price;union s0{//杯子struct s1{char sheji[20];}mark;//书本struct s2{char zuozhe[30];char shuming[40];int yeshu;}book;//衬衫struct s3{int size;char color[10];}shirt;}thing;
};我们把共有的特征放在结构体的开头把各自的特征各自特征组成的小结构体放在联合体中这样我们想调用那个商品的特征就直接从联合体里面调用了虽然联合体里面写了很多的特征但是它们都占一个空间相比于全部用结构体省了很多的空间。
练习我们用联合体再来重温一下判断大小端字节序进行代码展示码
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
union un
{char c;int i;
}s1;
int main()
{s1.i 1;if (s1.c 1)printf(小端字节);elseprintf(大端字节序);return 0;
}结果运行图
联合体的大小的计算
前面咱们讲过——编译器只会给联合体中最大的成员分配足够的空间也就是联合体的大小至少是最大成员的大小。那么是不是就可以理解为联合体的大小就是最大成员的大小。NO!NON!,不可以。进行代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
union un
{char arr[5];int i;
};
int main()
{printf(%zd\n,sizeof(union un));return 0;
}char arr[5]占有5个字节int i占有4个字节按照咱们的猜测答案是5吗 结果运行图 看来我们的猜测是错误的。因为联合体的大小还有如下的规则这才是真正的大小
【1】联合体的大小至少是最大成员的大小
【2】当最大成员的大小不是对齐数的整数倍时就要对齐到对齐数的整数倍char arr[5] 的对齐数是 1int i 的对齐数4最大对齐数是 4.而最大成员 char arr[5]是5个字节不是最大对齐数4的整数倍就要对齐到8才是最大对齐数的整数倍。
枚举类型的声明
概述枚举顾名思义就是逐个列举的意思中文解释。把可能的值给一一列举出来。
比如我们现实生活中
1.一周有7天可以一一列举出来。
2.性别男 女 保密。
3.颜色的三原色红 蓝 绿枚举的关键字是enum ,它的结构与结构体类似进行代码展示。
enum tag
{常量1 //注意枚举里面的每一个成员后面都是 ,结尾。常量2 最后一个成员的结尾什么也没有......常量n
}var_list;枚举的结构和结构体类似但是它的成员和结构体的不同。我们知道结构体的成员都是变量但是枚举的成员都是常量而且这个常量还不像数字那样的常量我们先来一代码进行展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
enum sex
{male,female,secret
};
int main()
{printf(%d\n, male);printf(%d\n, female);printf(%d\n, secret);return 0;
}结果运行图 大家可以看出来枚举里面都是常量。不知道大家有没有感觉到枚举的这个成员常量和重命名很像进行代码展示
#define male 0 ; // 把0重新命名为male, 也就是说male0枚举的常量成员就可以类比重命名。
注意事项 1.创建枚举时编译器就已经为里面的常量成员分配好值了编译器会默认给第一个成员分配0后面的成员分配一次增1。2.枚举的成员是常量是不可以更改的。进行代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
enum sex
{male,female,secret
};
int main()
{male 2;return 0;
}结果运行图 枚举的成员时常量所以是不可以修改的。但是我们可以在创建枚举时进行初值的修改进行代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
enum sex
{male6,female,secret
};
int main()
{printf(%d\n, male);printf(%d\n, female);printf(%d\n, secret);return 0;
}结果运行图 我们可以在创建枚举时进行修改初值。后面成员也是一次增1。
枚举类型的优点
前面咱们讲过了枚举定义常量和重命名是一样的那么为什么还要用枚举呢这就要讲到枚举的优点了。
枚举的优点 1.增加代码的可读性和可维护性。2.和#define定义的标识符比较枚举有类型检查更加严谨。3.便于调试预处理阶段会删除 #define 定义的符号。4.使用方便一次可以定义多个常量。这比重命名方便多了重命名要命很多次5.枚举常量是遵循作用域规则的枚举声明在函数内只能在函数内使用。
枚举类型的使用
虽然枚举的成员是常量但是枚举也是自定义数据类型它也可以定义变量。枚举定义变量时赋初值只能赋值枚举类型的常量自产自销。进行代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
enum sex
{male6,female,secret
};
int main()
{enum sex peo male;printf(%d\n,peo);return 0;
}结果运行图 那是否可以拿整数给枚举变量赋值呢在C语言中是可以的但是在C是不行的C的检查比较严格。
枚举类型的大小
我们讲过每个数据类型都有大小枚举也不例外。枚举的成员都是常量而且都是整型常量。所以枚举的大小就是整行int 的大小所以为4个字节。 直接记住枚举的大小就是整形大小——4个字节。结果运行图所示
彩蛋时刻
10月1日国庆快乐-毛主席语录https://www.bilibili.com/video/BV1Lm421M7XK/?spm_id_from333.337.search-card.all.clickvd_source7d0d6d43e38f977d947fffdf92c1dfad 每章一句趁年轻总要做点什么吧感谢你能看到这里点赞关注收藏转发是对我最大的鼓励咱们下期见