联合体和枚举类型

2024-06-09 11:44
文章标签 类型 枚举 联合体

本文主要是介绍联合体和枚举类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.联合体

1.1 联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同⼀块内存空间。所以联合体也叫:共用体。

给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

1.2联合体的特点

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

  • 我们看如下代码,&un 和 &un.i 和 &un.c 的地址是同一个地址,我们可以得出char 和int 公用一个内存空间 4

union Un {char c;int i;
};
​
int main() {union Un un = {0};printf("%zd", sizeof(un));printf("%zd", &un);printf("%zd", &un.c);printf("%zd", &un.i);
}

1.3联合体大小计算

  • 联合的大小至少是最大成员的大小。

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

我们看如下代码 最大成员大小为 5 不是4的倍数 那就浪费三个字节 最后占8个字节

union Un {
​char c[5];// 等于5个char类型 对齐数是1 8(最大) 1int i;//3                         4 8      4//然后 5不是4的倍数 那就浪费三个字节 最后占8个字节
​
};
int main() {printf("%zd", sizeof(union Un));
}

1.4什么场景使用联合体?

使用联合体是可以节省空间的,举例:

比如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。

每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

图书:书名、作者、页数

杯⼦:设计

衬衫:设计、可选颜色、可选尺存

那我们不思考,直接写出⼀下结构:

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

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

所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使用联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。

  • 用联合体类型的话,他们私有的属性就独立出来了,内存总共就给他们一个空间,然后他们共用一份空间,谁用的时候就占用这一份空间(使用的时候才创建),那就在一定程度上节省了空间

  • 结构体用匿名类型

  • 访问的时候 先找到gift_list结构体再找item 最后找你想要的

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;
};
  • 接下来我们回忆一下前面判断机器大小端的练习,现在我们用联合体去判断


union  Un
{char c;int i;
};
​
int main() {union Un u = { 0 }; //初始化u.i = 1;if (u.c == 1) {printf("小端");}else{printf("大端");}
}

2.枚举类型

2.1枚举类型声明

枚举顾名思义就是⼀⼀列举。

把可能的取值⼀⼀列举。

比如我们现实生活中:

⼀周的星期⼀到星期日是有限的7天,可以⼀⼀列举

性别有:男、女、保密,也可以⼀⼀列举 等等

这些数据的表示就可以使用枚举了。

{ }中的内容是枚举类型的可能取值,也叫 枚举常量 。

这些可能取值都是有值的,默认从0开始,依次递增1

//枚举类型
enum Sex {MALE,FEMALE,SECRET
​
};
​
int main() {enum Sex sex1 = MALE;printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);
}
当然在声明枚举类型的时候也可以赋初值,第一个常量永远是0其他的一次递增enum Sex {MALE,FEMALE=2,SECRET=
​
};
​
int main() {enum Sex sex1 = MALE;printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);
}
  • 我们会疑惑,为什么常量可以修改呢? 这并不是修改,只是给一个初始值,我们可以看到以下的赋值语句 MALE = 5 报错

//枚举类型
enum Sex {MALE,FEMALE=2,SECRET=3
​
};
​
int main() {enum Sex sex1 = MALE;MALE = 5; //这里不能赋值成功 修改失败printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);
}

2.2 枚举类型的优点

为什么使用枚举?

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

枚举的优点:

  1. 增加代码的可读性和可维护性

  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

  3. 便于调试,预处理阶段会删除 #define 定义的符号

  4. 使用方便,⼀次可以定义多个常量

  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

下面举一个加法器的例子体现枚举类型的优点,定义一个枚举类型可以让代码更有可读性

//定义一个枚举类型 提高代码的可读性
enum Option {EXIT = 0,ADD,SUB,MUL,DIV
};
​
void menu() {printf("***********************************");printf("********1.add   2.sub**************");printf("********3.mul   4.div**************");printf("********    0.exit   **************");
}
int main() {int input = 0;do {menu();printf("请选择你想要的计算:");scanf("%d", &input);switch (input){case ADD:  //方法名 比 1, 2 ,3 更有可读性,便于理解Add();break;case SUB:Sub();break;case MUL:Mul();break;case DIV:Div();break;case EXIT:break;default:printf("选择有误,请重新选择");}} while (input);
​
}

这篇关于联合体和枚举类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045086

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取