二十、自定义类型:枚举和联合

news2025/4/19 10:55:12

1 枚举类型

1.1 枚举类型的声明

例:

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

以上定义的enum Dayenum Sexenum Color都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量 。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值,比如:

#include <stdio.h>
enum Color//颜⾊
{
    RED=2,
    GREEN=4,
    BLUE=8
};
int main()
{
    printf("%d\n", RED);
    printf("%d\n", GREEN);
    printf("%d\n", BLUE);
	return 0;
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2 枚举类型的优点

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

枚举有以下优点:

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

1.3 枚举类型的使用

enum Color//颜⾊
{
	RED=1,
 	GREEN=2,
	BLUE=4
};
enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值

注意:在C语言中可以拿整数给枚举变量赋值,但是在C++中不行,C++的类型检查比较严格。

2 联合体类型

2.1 联合体类型的声明

//联合类型的声明
union Un
{
	char c;
	int i;
};

2.2 联合体类型的特点

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

例1:

#include <stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };//联合变量的定义
	printf("%d\n", sizeof(un));
	printf("%p\n", &un);
	printf("%p\n", &(un.c));
	printf("%p\n", &(un.i));
	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的输出结果可以看到,变量c和变量i占用的是同一块内存空间,而成员中i所占的内存最大,所以整个联合体的大小就是4个字节。

例2中,由于联合体的成员共用同一块内存空间,给联合体其中一个成员赋值,其他成员的值也会跟着变化,我们可以通过下面un的内存布局图来加深理解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.3 联合体大小的计算

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

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

例:

//下面输出的结果是什么?
#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;
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解析:

#include <stdio.h>
union Un1
{
	char c[5];
	int i;
};
//最大成员的大小是5,不是最大对齐数(4)的整数倍,所以对齐到8。
union Un2
{
	short c[7];
	int i;
};
//最大成员的大小是7,不是最大对齐数(4)的整数倍,所以对齐到16。
int main()
{
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

2.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,所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体来存储,这样就可以减少所需的内存空间。

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;
};

2.5 练习

百度笔试题:设计一个小程序,判断当前机器的字节序。

//使用联合体判断系统的字节序
#include <stdio.h>
int check_sys()
{
	union//因为un我们只用一次,所以这里可以采用匿名的形式
	{
		char c;
		int i;
	}un = { .i = 1 };
	return un.c;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端存储\n");
	else
		printf("大端存储\n");
	return 0;
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超赞的AI文案生成器!真的什么都能写~

姐妹们&#xff0c;这个AI文案生成器真的太强了&#xff01; 种草笔记、爆款标题、短视频脚本、工作总结、自定义小说生成......只要输入关键词&#xff0c;就能生成一篇专业又优秀的文章&#xff0c;真的太绝了~ 小橙需&#xff1a;写作火火 安卓ios都可用 使用简单&#…

快上车,LLM专列:想要的资源统统给你准备好了

如有转载&#xff0c;请注明出处。欢迎关注微信公众号&#xff1a;低调奋进。​ (嘿嘿&#xff0c;有点标题党了​。最近整理了LLM相关survey、开源数据、开源代码等等资源&#xff0c;后续会不断丰富内容&#xff0c;省略大家找资料浪费时间。闲言少叙&#xff0c;正式发车&a…

【苍穹外卖 | 项目日记】第二天

前言&#xff1a; 坦率的讲今天有点水&#xff0c;课也多&#xff0c;上了一天课&#xff0c;中午下课后和晚上十一点多跑完步回来写了两个接口 目录 前言&#xff1a; 今日完结任务&#xff1a; 今日收获&#xff1a; 1.实现了公共字段填充功能 2.实现了文件上传接口 杂项…

35道Rust面试题

这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 &#xff0c;下面哪个是打印变量language的正确方法&#xff1f; A&#xff0c;println("{}", language); B&#xff0c;println(language); C&#xff0c;println!("{}", langu…

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复

我是网友&#xff0c;今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信&#xff0c;在座的许多朋友都曾遇到过这个问题&#xff0c;而今天我将为大家介绍五种有效的解决方法。 首先&#xff0c;让我们来了解一下vcruntime1…

stm32mp157中断简单应用

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 main.c #include "gpio.h" #include &…

99 # mongo 的基本安装和配置

关系型数据库和非关系型数据库 MySQL Oracle SqlServer 用一种关系模型来组织数据的数据库&#xff08;查询方便&#xff0c;不方便拓展&#xff09;nosql mongo redis memcached &#xff08;不同于传统的关系数据库&#xff09; mongo 特点 分布式&#xff1a;文档类型&am…

地下城堡3魂之诗阵容搭配攻略

在地下城堡3魂之诗游戏中&#xff0c;拥有一个合理搭配的阵容非常关键&#xff0c;可以让角色能力发挥最大化。以下是建议的阵容搭配及攻略&#xff1a; 关注【娱乐天梯】&#xff0c;获取内部福利号 1.核心成员(2名) 在阵容中选择两个输出型角色作为核心成员&#xff0c;他们的…

Vue实战项目1:跑马灯效果

Vue实战项目1&#xff1a;跑马灯效果 目录 一、效果预览二、编写思路三、整体代码展示 一、效果预览 二、编写思路 两个按钮用于启动和停止&#xff0c;绑定点击事件&#xff0c;使用v-on&#xff0c;可以简写为 <input type"button" value"跑起来" c…

扒一扒集成运放uA741的内部电路

uA741是一款常见的集成运放芯片,这个是uA741的内部电路。 Q1与Q2组成的差动对是整个741运算放大器的输入端,这两个三极管是射极跟随器的连接方式,特点是输入电阻大,输出电阻小。 Q1和Q2的输出接至共基极组态的PNP晶体管Q3和Q4

ECharts 双y轴时如何处理0刻度线对齐的问题

ECharts 多y轴时如何处理0刻度线对齐的问题 用echarts做双&#xff08;多&#xff09;轴时发现其中某轴有负数时0刻度线不对齐。 解决 首先判断是否有负数 const hasNegative Math.min(...seriesData[0], ... seriesData[1]);如果有的话&#xff0c;我的配置是这样的 yAxi…

Python利用jieba分词提取字符串中的省市区(字符串无规则)

目录 背景库&#xff08;jieba&#xff09;代码拓展结尾 背景 今天的需求就是在一串字符串中提取包含&#xff0c;省、市、区&#xff0c;该字符串不是一个正常的地址;,如下字符串 "安徽省、浙江省、江苏省、上海市,冷运标快首重1kg价格xx元,1.01kg(含)-5kg(不含)续重价…

RabbitMQ详细使用

工作队列 注意事项&#xff1a;一个消息只能被处理一次&#xff0c;不可以处理多次 轮询分发信息 消息应答 消费者在接收到消息并且处理该消息之后&#xff0c;告诉rabbitmq它已经处理了&#xff0c;rabbitmq可以把该消息删除了。倘若mq没有收到应答&#xff0c;mq会将消息转…

车载相关名词--车载数据中心方案

车载数据中心方案 参考链接:https://zhuanlan.zhihu.com/p/600031042?utm_id=0 下面这张图是小鹏汽车嵌入式系统高级专家 唐黾 在同ARM一起的一个演讲稿中发布的,是一张未来车载数据中心单芯片方案构想图。主要针对的是智驾域和座舱域融合方案,下面对如上图的内外部组件及…

telnet 连接闪退

目录 问题查找问题解决参考 问题 在使用 telnet 连接板子时&#xff0c;出现了 telnet 界面一闪而逝的情况。正常板子开机&#xff0c;查看其存在 telnetd 进程&#xff0c;而使用 telnet 后&#xff0c;登录界面一闪而逝&#xff0c;板子上的 telnetd 进程消失。 查找问题 …

go cpu、内存监控、性能分析:PProf

PProf PProf 是什么 PProf是 golang 官方提供的性能调优分析工具&#xff0c;用于分析和优化Go程序的性能。 PProf通过收集和分析程序的运行时数据来生成性能分析报告。它使用Go语言的运行时特性&#xff0c;如代码注释和特殊的程序运行标记&#xff0c;来收集性能数据。PPr…

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…

ubuntu22.04 电脑声音和腾讯会议等声音很小怎么修复

电脑的声音很小&#xff0c;特别是开微信会议的时候几乎听不到声音&#xff0c;而声音设置都已经设置为最大 这时候就是用命令 alsamixer腾讯会议的声音 调整这两个声音的大小即可 H键弹出帮助菜单 F6按键选择声卡 左右按键选择轨道 M键静音所选轨道 上下按键调整音量…

共生与共享:线程与进程的关系

&#x1f30d;前言 在计算机科学和操作系统领域&#xff0c;线程&#xff08;Thread&#xff09;和进程&#xff08;Process&#xff09;是两个关键概念。它们之间存在密切的关系&#xff0c;但又有着明显的区别。本文将深入探讨线程和进程之间的关系&#xff0c;以及它们在并…

CCF CSP认证 历年题目自练Day29

题目一 试题编号&#xff1a; 202112-1 试题名称&#xff1a; 序列查询 时间限制&#xff1a; 300ms 内存限制&#xff1a; 512.0MB 样例1输入 3 10 2 5 8 样例1输出 15 样例2输入 9 10 1 2 3 4 5 6 7 8 9 样例2输出 45 题目分析&#xff08;个人理解&#xff09; 还是…