【C语言】自定义类型——联合和枚举

目录

一、联合体(共用体)

(1)联合体类型的声明

(2)联合体类型的特点

(3)联合体和结构体的比较

(4)联合体大小的计算

(5)联合体的应用

二、枚举类型

(1)枚举的声明

(2)枚举的优点

(3)枚举类型的使用


一、联合体(共用体)

(1)联合体类型的声明

        形式上跟结构体相似,只不过把 struct 改为 union:

union U
{
	char c;//1 
	int i; //4
};

(2)联合体类型的特点

  •  只为需要空间最大的成员分配足够的空间。
  •  成员共用一个空间(因此,联合体又叫共用体)。

        以上代码,联合体大小是成员 i (所需空间最大的成员)的大小;联合体、每个成员的地址都是 004FFA90(成员共用一个空间)。如下所示:

        更改成员 c 的值,成员 i 的值也会改变:

(3)联合体和结构体的比较

// 结构体
struct S
{
 char c;
 int i;
};

// 联合体
union Un
{
 char c;
 int i;
};

        内存对比:

        看应用场景选择使用结构体还是联合体,应用见(5)。

(4)联合体大小的计算

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

        例子:

(5)联合体的应用

        联合体适用于不需要给每个成员开辟空间,且成员不需要同时使用的场景,可以节省空间。例1:存储商品的信息,如下(蓝色部分是三种商品共有的信息):

        如果直接用结构体类型存储,如下:

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;//尺寸
};

        定义商品变量时,图书不需要设计、颜色、尺寸信息;杯子不需要书名、作者、页数等信息。使用结构体类型,会浪费很多空间。

        我们可以把共有的信息单独写出来,三种特殊的信息用联合体存储(只为最大的特殊信息开辟空间),就能节省空间,如下:

struct gift_list
{
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

    // 只给 item.book 分配空间
	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:判断当前机器是大端还是小端。

方法1:

int check_sys()
{
    // 1的十六进制(int为4字节):0x00 00 00 01
    // 地址从左向右递增
    // 大端:00 00 00 01(低位数据放高地址)
    // 小端:01 00 00 00(地位数据放低地址)
	int a = 1;
	if (*(char*)&a == 1) // 取最低的一个字节数据
		return 1; // 01,小端
	else
		return 0; // 00,大端
}

方法2(用联合体):

二、枚举类型

(1)枚举的声明

        枚举就是 一 一 列举,其声明形式如下:

enum Day//星期
{
	Mon, // 枚举常量
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};

        包含的内容是枚举类型可能的取值,称为枚举常量。枚举常量的取值,默认从0开始依次递增,也可以赋初值:

(2)枚举的优点

  •  增加了代码的可读性和可维护性。
// 如果用变量代表性别
int sex = 0; // 0 表示男,1表示女,2表示保密
// 判断是否是男性
if(sex == 0)
    printf("yse");
// 明显,0、1、2 的含义不直观


// 如果用枚举代表性别
enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};
enum Sex sex = MALE;
// 判断是否是男性
if(sex == MALE)
    printf("yse");
// MALE就是男,可读性明显增强
  •  和 #define 定义的标识符比较,枚举有类型检查,更加严谨,不易出错。
#define MALE 0
#define FEMALE 4
// 宏定义只是在编译时,用 0 替换 MALE,MALE 没有类型

enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};
// 而枚举中的 MALE 有类型,就是 enum Sex
  •  使用方便,一次可以定义多个常量。
#define MALE 0
#define FEMALE 1
#define SECRET 2
// 宏定义要多次写 #define,并且值也要自己设置

enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};
// 而枚举只需要在一个枚举类型里,加一个枚举常量名,自动赋值。
  •  枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用(宏定义只能全局)。

(3)枚举类型的使用

        在 C 语言中可以拿整数给枚举变量赋值;但 C++ 的类型检查更严谨,不能拿整数给枚举变量赋值。

        C 中:

        C++ 中:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3588/RK3588s运行yolov8达到27ms

前言 Hello,小伙伴们~~我最近做了一个比较有意思的东西,想起来也好久没有写博客了,就记录一下吧。希望和大家一起学习,一起进步! 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…

Docker笔记-容器数据卷

Docker笔记-容器数据卷 docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器 之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像&#xf…

assign是赋值,不是连接

如下图是一个top文件的背压 如果把原本应该是外界输入的变量m_ip_hdr_ready通过phv_parser_hdr_ready来“赋值!!!”,那么模块内部本该有的ready信号,就会是Z高阻态,因为没有给到值。 正确的赋值 将整个模…

【医疗大数据】医疗保健领域的大数据管理:采用挑战和影响

选自期刊**《International Journal of Information Management》**(IF:21.0) 医疗保健领域的大数据管理:采用挑战和影响 1、研究背景 本研究的目标是调查阻止医疗机构实施成功大数据系统的组织障碍,识别和评估这些障碍,并为管理…

微信小程序拨打电话点取消报错“errMsg“:“makePhoneCall:fail cancel“

问题:微信小程序中拨打电话点取消,控制台报错"errMsg":"makePhoneCall:fail cancel" 解决方法:在后面加上catch就可以解决这个报错 wx.makePhoneCall({phoneNumber: 181********}).catch((e) > {console.log(e) //用…

调整pycharm中的字体大小

1.找到设置 2.打开setting ,按照图示操作即可

YOLOv5白皮书-第Y1周:调用官方权重进行检测

>- **🍨 本文为[🔗365天深度学习训练营](小团体~第八波) 中的学习记录博客** >- **🍖 原作者:[K同学啊](K同学啊-CSDN博客)** 一、前言 拖了好久,终于要开始目标检测系列了。自己想过好几次&#xf…

中秋节特别游戏:给玉兔投喂月饼

🖼️ 效果展示 📜 游戏背景 在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙 🎮 游戏设计 人…

Broadcast:Android中实现组件及进程间通信

目录 一,Broadcast和BroadcastReceiver 1,简介 2,广播使用 二,静态注册和动态注册 三,无序广播和有序广播 1,有序广播的使用 2,有序广播的截断 3,有序广播的信息传递 四&am…

[产品管理-15]:NPDP新产品开发 - 13 - 产品创新流程 - 具体产品的创新流程:精益生产与敏捷开发

目录 前言:​ 一、集成产品开发IPD模型——集成跨功能团队的产品开发 1.1 概述 1、IPD模型的核心思想 2、IPD模型的主要组成部分 3、IPD模型的实施步骤 4、IPD模型的优点 1.2 基于IPD系统的组织实践等级 1.3 IPD的优缺点 二、瀑布开发模型 1、定义与特点…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务,2211实际是ssh协议端口,80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

opencv图像透视处理

引言 在图像处理与计算机视觉领域,透视变换(Perspective Transformation)是一种重要的图像校正技术,它允许我们根据图像中已知的四个点(通常是矩形的四个角)和目标位置的四个点,将图像从一个视…

软件安装攻略:EmEditor编辑器下载安装与使用

EmEditor是一款在Windows平台上运行的文字编辑程序。EmEditor以运作轻巧、敏捷而又功能强大、丰富著称,得到许多用户的好评。Windows内建的记事本程式由于功能太过单薄,所以有不少用户直接以EmEditor取代,emeditor是一个跨平台的文本编辑器&a…

聊城网站建设:企业如何打造高效官网

聊城网站建设:企业如何打造高效官网 在互联网飞速发展的今天,官方网站已成为企业展示形象、推广产品、与客户沟通的重要平台。尤其对于聊城地区的企业来说,建立一个高效的官网显得尤为重要。本文将分享一些关键步骤,帮助企业打造一…

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片(block)处理&#xff…

人工智能快速发展下的极端风险管理

文章目录 前言一、快速进步与高风险并存1、深度学习系统缺乏关键功能,其开发周期尚不明朗2、自主人工智能系统一旦导向不良目标,人类可能面临其失控风险 二、技术研发方向调整1、实现安全人工智能的基础性突破,确保人工智能可靠安全2、实现有…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

Python酷库之旅-第三方库Pandas(123)

目录 一、用法精讲 546、pandas.DataFrame.ffill方法 546-1、语法 546-2、参数 546-3、功能 546-4、返回值 546-5、说明 546-6、用法 546-6-1、数据准备 546-6-2、代码示例 546-6-3、结果输出 547、pandas.DataFrame.fillna方法 547-1、语法 547-2、参数 547-3、…

AI+教育|拥抱AI智能科技,让课堂更生动高效

AI在教育领域的应用正逐渐成为现实,提供互动性强的学习体验,正在改变传统教育模式。AI不仅改变了传统的教学模式,还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务,AI正在全方位提升教育质量和效率。随着…