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

【c++教程】2.8-联合体类型 联合体 union,联合体类型,有的时候也会被叫做共用体。也是一种特殊的类类型,和结构体很相似。 1,联合体所有的成员都共用同一段内存。联合体中的所有成员,只有一个可以是活跃的,其他的都是不可用的。 2,联合体必须以分号结束。 3,联合体不可以用于继承,没有虚函数。数据成员默认的声明方式为公有。 4,在c++11以前,联合体不可以有含有自定义的构造函数,自定义的析构函数或者重载的复制赋值运算符的成员。在c++11以后,联合体可以有这些成员,但是相关的所有函数全都被丢弃,需要自行提供。 联合体的使 阅读详情

1 枚举类型

1.1 枚举类型的声明

例:

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

以上定义的enum Day,enum Sex,enum 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;
}

输出结果:

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

超详细C语言联合体union详解 文章目录前言一、联合(共用体)定义二、联合的特点及运用三、联合的大小计算总结 前言 上一期C语言快速入门我们学习了枚举类型及相关知识点,这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你一定会有所收获! 提示:以下是本篇文章正文内容,下面案例可供参考 一、联合(共用体)定义 联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。 代码如下(示例): #include<stdio.h> union Un//联合类型的声明. 阅读详情

相关推荐

自锁电路设计

Hi,uu们,是不是经常要用到自锁电路,通常不是使用555芯片就是用比较器来做自锁,今天我们来简单看下自锁电路的设计.图1采用了比较器构建了一个自锁电路,采用低电平复位,当需要复位的时候志需要将反向端的二极管拉低一下即可,免去 三极管控制同相端和电源短接的麻烦。图1:比较器构建的自锁电路也可以使用555去构建,如下图2所示.图2:使用555构建的自锁电路工作原理见555的真值表,真值表如表1所示.表1:555电路真值表相对来说555还是比较贵,所以我就想能不能有个便宜的方法做个自锁电路,构建电路如下图3所示

weixin_43884675的博客 7059

enum使用技巧

enum关键字是用来定义枚举类型,其一般的声明形式为: enum 枚举名 {枚举值表}; //枚举值之间的间隔是用逗号分隔 其定义枚举变量的形式为:enum 枚举名 变量;//变量的值需是枚举值表中对应的值 enum实例: enum WIDGET_ID {     BUTTON_ID_RETURN = 1000,     BUTTON_ID_CHECK_UPDATE,     BUT

Helloguoke的专栏 919

保姆级教程:用Python+Mediapipe实时捕捉手势,驱动Unity虚拟手模型(附完整源码)

本文详细介绍了如何利用Python的Mediapipe库和Unity实现实时手势识别与虚拟手模型驱动。通过OpenCV进行图像采集,Mediapipe提供21个手部关键点识别,结合UDP通信协议实现Python与Unity之间的低延迟数据传输。教程包含完整源码、环境配置、核心代码实现及性能优化技巧,适用于VR教育、游戏开发等需要自然交互的场景。

weixin_42531779的博客 361

自定义的enum类型一般都是在类的.h文件中定义吗_Mybatis高级玩法:使用Mybatis的typeHandler优雅地进行类型转换...

我是 码农小胖哥。天天有编程干货分享。觉得写的不错可以点个赞,转发一下,关注一下。 1.场景日常java开发中经常有这种需求,用0或者1这些代码(不局限于数字)来表示某种状态。比如用0表示女性,用1来表示男性。而且写入数据库可能是一个标识,从数据库读取又还原为具体的说明。而且一般情况下为了更好理解或者消除魔法值,通常的处理方案是定义一个枚举:有些枚举是这样定义的那么通常很多人会这么入库(java伪...

weixin_39862382的博客 373

如何使用ArcGIS Pro制作带基底三维地图

点击运行生成范围线,因为之前对高程进行了夸大,导致生成的范围线和地形边缘不重合,我们打开范围线的图层属性,选择高程选项卡,要素位于选择地面上,如下图所示。目前制作的三维地图下面是空的一片,现在添加一个基底,在工具箱内点击“3D Analyst工具\栅格\转换\栅格范围”,调用栅格范围工具,如下图所示。打开ArcGIS Pro,新建一个局部场景,在高程表面下,地面上点击右键,选择添加高程源图层,将需要制作三维地图的DEM数据加载进来,如下图所示。在要素图层菜单内,类型选择绝对高度,如下图所示。

3976

观测器选择与工程实践建议

摘要:永磁同步电机(PMSM)无传感器控制中,观测器选型需综合考虑应用场景、性能需求与成本。消费级(家电、工具)推荐滑模观测器(SMO),成本低、鲁棒性强;工业级(伺服、泵阀)适用扩展卡尔曼滤波器(EKF),精度高但计算复杂;车规级(EPS、主驱动)需混合观测器(SMO+EKF),兼顾全速域性能与可靠性。低速时需高频注入法,IPMSM更适用。SMO易实现但存在抖振,EKF调试复杂。未来趋势是混合架构与AI增强,提升适应性与性能。选型需权衡速度范围、电机类型、处理器能力及成本。

汽车软件开发 145

C语言自定义类型变量——联合体(union)

/一.同时创建模板和变量char c;int i;}un;//二.先定义模板,再定义变量char c;int i;//三.匿名联合体(一次性的,后面不能再次使用它定义新变量)unionchar c;int i;}un1, un2;//使用typedefchar c;int i;}U_data;

2301_80827065的博客 4634

XXL-Job 分布式定时任务

XXL-JOB是一款轻量级分布式定时任务调度框架,采用调度中心与执行器分离架构,解决单机任务宕机、重复执行等问题。核心模块包括调度中心(管理任务配置、触发调度)和执行器(执行任务逻辑),支持集群部署保证高可用。框架提供丰富的任务触发规则、路由策略、阻塞策略及完善的运维能力,适用于多种业务场景如数据同步、定时推送等。安装时需准备MySQL数据库并初始化表结构,通过Docker部署调度中心服务。相比其他定时框架,XXL-JOB具有轻量化、可视化等优势,是中小企业的首选方案。

郭宝的博客 694

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

联合和枚举

Chen_harmony的博客 744

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4540

华为MetaERP Oracle EBS OM(订单管理)模块详解作为ERP财务解决方案架构师,理解OM模块的业务全景和数据模型至关重要。OM是EBS分销链路的核心引擎,贯穿“订单到收款“(Orde

Oracle EBS OM模块是管理销售订单全生命周期的核心模块,涵盖客户管理、订单执行、发运开票、定价及信用控制等功能。其标准流程包括订单录入、预订、发放、发运确认和自动开票等环节,核心数据表涉及订单、客户、发运和定价等业务对象。OM模块与库存、应收、发运等模块深度集成,架构师需重点设计订单类型、信用控制策略和自动开票接口等关键环节,确保业务流程高效流转。

金牌架构师 355

C语言入门(二十六):自定义类型:联合和枚举

联合体(union)是一种特殊的数据类型,它允许在。

世界万物,永恒不变,人心炽热,璀璨光芒 1104

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 365

C语言基础:(二十一)自定义类型:联合和枚举

本文介绍了C语言中联合(union)和枚举(enum)两种数据类型。联合体通过共享内存空间存储不同类型数据,只分配最大成员所需内存,可节省空间并提高效率。枚举则通过命名常量提升代码可读性,具有类型检查、便于调试等优点。文章详细讲解了联合体的声明、特点、大小计算及实际应用案例,如利用联合体判断机器字节序;同时阐述了枚举类型的声明方式、优点和使用方法。通过对比结构体和联合体的内存布局,展示了联合体在内存优化方面的优势。

2301_79248256的博客 1111

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

系统性学习C语言-第二十一讲-自定义类型:联合和枚举

你所见过的最全面,最详细讲解C语言知识点的文章,第二十一讲-自定义类型:联合和枚举

2401_87023016的博客 1010

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言学习记录(14)自定义类型:联合和枚举

我们在刚开始学C语言的时候学习的都是内置类型,char int long double等类型的数据;上次又学习了自定义类型其中之一的结构体,有了这样的基础,继续学另外一个自定义类型,联合。

2401_85751795的博客 917

结构体、枚举类型和联合体

结构体是C语言中重要的知识点,结构体使C语言有能力描述复杂的类型。比如描述一个学生,一个学生包含: 名字+年龄+性别+学号。我们用基本的数据类型没有办法描述这样的复杂对象,这里就只能使用结构体来描述了。int x;int y;} p1;//声明类型的同时定义变量p1 struct Point p2;//定义结构体变量p2 struct Point p3 = {x , y };//初始化:定义变量的同时赋初值。//性别 int age;//年龄 };

yanghuagai2311的博客 2880

第二十章(自定义类型,联合和枚举)

概念:像结构体一样,联合体也是由一个或者多个成员组成的,这些成员也可以是不同的类型。这里我们发现,在c语言中我们可以拿整数给枚举变量赋值,但是在c++中这是不行的。2.与define定义的标识符相比较,枚举类型更容易检查,更加严谨。枚举类型我们从表面的意思就可以很好的了解,是一一例举出来的意思。1.2 联合体的特点:因为联合体是共用一块空间的,所以。接下来我们就来画图解释。{ }的内容都是枚举类型的可能取值,我们称之为。我们能够看出来的是,联合体会很好的节约空间。在声明枚举类型的时候我们是可以给其赋值的。

code_whiter的博客 637

C语言入门(二十一)联合和枚举

联合和枚举  联合(union): 一、联合说明和联合变量定义  联合也是一种新的数据类型, 它是一种特殊形式的变量。 联合说明和联合变量定义与结构十分相似。其形式为: union 联合名 {  数据类型 成员名;  数据类型 成员名;  ...  }联合变量名;  联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。  下例表示说明一个联

比较喜欢、笑的博客专栏 7230

自定义类型(3)枚举与联合

枚举与联合的知识点讲解

Pythoniiiiii的博客 367

学C的第三十天【自定义类型:结构体、枚举、联合】

【自定义类型:结构体、枚举、联合】:1 . 结构体 ; 2 . 位段(位域) ; 3 . 枚举 ; 4 . 联合(共用体)

正在努力学C呀!(要学好久呢......) 1857

c语言自定义类型(位段,枚举,联合)

爆肝一个假期的笔记补档。 这个月可能会发十几二十几篇吧。 这个是目录位段什么是位段位段的内存分配位段的跨平台问题枚举枚举的使用联合联合类型的定义联合的特点联合体大小的计算练习 位段 位段是通过结构体实现的。(也会有对齐之类的) (位段以比特位作为单位) 什么是位段 位段的声明和结构是类似的,有两个不同: 位段的成员必须是char、 int、unsigned int 或signed int 。 位段的成员名后边有一个冒号和一个数字。 如 struct A { int _a:2; int _b:5;

Jessica的博客 465

C++学习(二十六)(C语言部分)之 结构体3(联合,枚举)

结构体 struct 类型定义点运算符 . 变量名.成员 成员是数组的时候不能用等于号赋值箭头运算符 -> 指针->成员 作用 存放多个不同类型的有关联的数据 与结构体类似的类型1、联合作用 :存放不同类型的数据 (共同体) 同事只能存储一个数据关键字 :union 和结构体类似联合与结构体的区别: 结构体: 是每个成员有地址分配 即有单独的...

weixin_30527143的博客 129

结构体,枚举类型与联合体

结构体、枚举、联合的C语言复杂类型的深度刨析

qq_65285898的博客 1440

学习c语言第二十天(自定义类型)

int x;int y;47个比特位enum daymon,tuse,wed,thur,fri,sat,sunint main()return 0;联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)union unint a;char c;共用一块地方int main()union un u;

2301_79600945的博客 717

c语言-零基础学习第二十三讲-位段_联合_枚举

位段的成员名后边有⼀个冒号和⼀个数字。//占2个bit位int _b:5;//占5个bit位int _c:10;//占10个bit位int _d:30;//占30个bit位意义:节约空间。

2301_78922485的博客 110
上一篇: 十九、自定义类型:结构体
下一篇: 二十一、动态内存管理
Kutbas
博客等级 码龄7年 737粉丝 55原创
评论 28
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kutbas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值