当前位置: 首页 > news >正文

详解自定义类型:枚举与联合体!

目录

 ​编辑

一、枚举类型

1.枚举类型的声明

2.枚举类型的优点

3.枚举类型的使用

二、联合体类型(共用体)

1.联合体类型的声明

2.联合体的特点

3.相同成员的结构体和联合体的对比

4.联合体大小的计算

5.用联合体判断大小端

  三.完结散花


 

                                            悟已往之不谏,知来者犹可追                                                        

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~ 

一、枚举类型

1.枚举类型的声明

枚举顾名思义就是一一列举~

比如在我们现实生活中:

一个星期有七天可以一一列举~

一个人的性别有男、女、保密三种可以一一列举~

月份有12个月可以一一列举~

所以这些数据我们就可以用枚举来表示了~

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

注意:上面的enum Day、enum Sex、enum Color都是我们自定义的枚举类型,其中枚举类型的关键字是enum,而{}中的内容是枚举类型的可能取值,也叫枚举常量

而且这些枚举常量都是有值的,默认从0开始,然后依次递增1,当然  我们在声明枚举类型的时候也可以赋初值~

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语言中是可以的,但是在C++是不行的,C++的类型检查比较严格

二、联合体类型(共用体)

1.联合体类型的声明

像结构体⼀样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同⼀块内存空间。所以联合体也叫:共用体
给联合体其中一个成员赋值,其他成员的值也跟着变化

2.联合体的特点

#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
//计算连个变量的⼤⼩
printf("%d\n", sizeof(un));
}

 

为什么是4呢?

联合的成员是共用同⼀块内存空间的,这样⼀个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

//代码1
#include <stdio.h>
//联合类型的声明
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 <stdio.h>
//联合类型的声明
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;
}

 代码一的结果如下~

代码二的结果如下~

代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。
我们仔细分析就可以画出,un的内存布局图


     

3.相同成员的结构体和联合体的对比

我们再对比一下相同成员的结构体和联合体的内存布局情况。

struct S
{
char c;
int i;
};
struct S s = {0};
struct S
{
char c;
int i;
};
struct S s = {0};

 

4.联合体大小的计算

• 联合的大小至少是最大成员的大小。
• 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

#include <stdio.h>
union 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;
}

5.用联合体判断大小端

#include <stdio.h>
int check_cyc()
{union{int i;char c;}un;un.i = 1;return un.c;
}
int main()
{int ret = check_cyc();if (ret == 1)printf("小端存储\n");elseprintf("大端存储\n");return 0;
}

VS2022上的结果~ 

6.联合体的使用用例

使用联合体是可以节省空间的,举例:
比如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸
那我们不耐心思考,直接写出⼀下结构:

struct gift_list
{
//公共属性
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
//特殊属性
char title[20];//书名
int num_pages;//⻚数
char design[30];//设计
int colors;//颜⾊
int sizes;//尺⼨
};

上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。

比如:商品是图书,就不需要design、colors、sizes
所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存。

 

struct gift_list
{
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
union{
struct
{
char title[20];//书名
char author[20];//作者
int num_pages;//⻚数
}book;
struct
{
char design[30];//设计
}mug;
struct
{
char design[30];//设计
int colors;//颜⾊
int sizes;//尺⼨
}shirt;
}item;
};

  三.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

http://www.lryc.cn/news/301270.html

相关文章:

  • 第13章 网络 Page738~741 13.8.3 TCP/UDP简述
  • Tomcat要点总结
  • Ubuntu 20.04 安装RVM
  • Ps:污点修复画笔工具
  • JAVA面试题17
  • 数据备份和恢复
  • 核心篇 - 集成IS-IS配置实战
  • 【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅
  • MVC 、DDD、中台、Java SPI(Service Provider Interface)
  • C++单例模式的实现
  • rust函数 stuct struct方法 关联函数
  • 浅谈基于中台模式的大数据生态体系的理解
  • MySQL的锁机制
  • 已解决ImportError: cannot import name ‘PILLOW_VERSION‘异常的正确解决方法,亲测有效!!!
  • 力扣:300. 最长递增子序列
  • Swing程序设计(10)列表框,文本框,文本域,密码框
  • 【Java八股面试系列】JVM-常见参数设置
  • 【Python--Web应用框架大比较】
  • Effective Objective-C 学习第三周
  • 人工智能学习与实训笔记(四):神经网络之NLP基础—词向量
  • 【教程】Kotlin语言学习笔记(一)——认识Kotlin(持续更新)
  • MySQL性能分析1
  • 四、案例 - Oracle数据迁移至MySQL
  • ABC340 A-F题解
  • 微软 CMU - Tag-LLM:将通用大语言模型改用于专业领域
  • Kafka集群安装与部署
  • C++初阶(十一) list
  • 图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化
  • CMake进行C/C++与汇编混合编程
  • 缓存预热!真香