【C语言】——联合体与枚举

news2024/11/24 11:36:12

【C语言】——联合体与枚举

    • 一、联合体
      • 1.1、联合体类型的声明
      • 1.2、联合体的特点
      • 1.3、相同成员的结构体和联合体对比
      • 1.4、联合体的大小计算
      • 1.5、联合体的应用举例
    • 二、枚举
      • 2.1、枚举类型的声明
      • 2.2、枚举类型的优点

一、联合体

1.1、联合体类型的声明

  
  联合体也叫做共用体
  与结构体一样,联合体也是自定义类型,同样,也是由一个或多个的成员构成,这些成员类型可以相同也可以不同。
  与结构体不同的是,编译器只会为联合体中最大的成员开辟足够的内存空间。正如联合体这个名字一样,联合体的所有成员共用这一块内存空间
  这样,因为使用的是同一块内存,一个联合体成员改变,其他联合体成员也会跟着改变
  
  联合体的声明与结构体非常类似,下面我们直接看代码:

#include<stdio.h>

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

int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//计算各个变量的大小
	printf("%d\n", sizeof(un));
	return 0;
}

  
运行结果:

在这里插入图片描述

  为什么大小是 4 呢?我们一起来学习联合体的特点
  

1.2、联合体的特点

  联合体最大的特点就是所有成员共用一块内存空间,因此联合体变量的大小,至少最大成员变量的大小(因为联合体至少保证有能力存储那个成员)
  
  我们可以通过代码来理解联合体的特点
  
代码一:

#include<stdio.h>

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

int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//下面输出的结果是一样的吗?
	printf("%d\n", &(un.i));
	printf("%d\n", &(un.c));
	printf("%d\n", &un);
}

  
运行结果:
在这里插入图片描述

  
代码二:

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

运行结果:

在这里插入图片描述

  
  可以看到,代码一中,取出的三个地址都是一样的,说明成员之间共用一个内存空间
  
  至于代码二,我们发现低位字节的内容改了,我们可以通过画图来分析
  

在这里插入图片描述

  

  看到这里,不知大家有没有联想到判断大小端存储(详情请看【C语言】——数据在内存中的存储),是的,我们可以利用联合体来对判断机器是大端存储还是小端存储
  

int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}

  
  我们往联合体成员 i i i 中放入1,在返回联合体成员 c c c,因为 c c c c h a r char char 类型,取出的是 i i i地址最小的字节的内容,当取出值为 1,说明低位数字放低地址,为小端存储;如果为 0,说明低位数字放高地址,为大端存储
  
  

1.3、相同成员的结构体和联合体对比

  
  下面,我们来对比一下相同成员的结构体和联合体的内存布局情况:

struct S
{
	char c;
	int i;
};


union Un
{
	char c;
	int i;
};

  

在这里插入图片描述

  

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

  
运行结果:

在这里插入图片描述

  

为什么会这样呢?联合体的大小是怎么计算的呢?它满足两条规则:

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

图示:

在这里插入图片描述

  通过这图,就能很好地分析出上面两个联合体的大小啦

  
  

1.5、联合体的应用举例

  
  结构体的使用,最主要的是节省空间

  现在有这么一个场景:我们要举办一个活动,要上线一个礼品兑换单,兑换单中有三种商品:图书、杯子、衬衫。每一种商品都有:库存量,价格、商品类型以及和商品类型相关的其他信息

  • 图书:书面、作者、页数
  • 杯子:设计
  • 衬衫:设计、可选颜色、可选尺寸

  我们不耐心思考,直接写出一下结构

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

	//特殊属性
	char title[20];//书名
	char autor[20];//作者
	int num_pages;//页数

	char design[30];//设计
	int colors;//颜色
	int sizes;//尺寸
};

  
  上述的结构设计的其实很简单,用起来也很方便,但是结构汇的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。因为对于礼品兑换单种的商品来说,只有部分属性信息是常用的,比如:
  
  商品时图书,就不需要 d e s i g n design design c o l o r s colors colors s i z e s sizes sizes
  
  所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体这样就可以减少内存所需要的内存空间,一定程度上节省了内存。
  

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

	//特殊属性
	union {
		struct
		{
			char title[20];//书名
			char autor[20];//作者
			int num_pages;//页数
		}book;
		struct
		{
			char design[30];//设计
		}mug;
		struct
		{
			char design[30];//设计
			int colors;//颜色
			int sizes;//尺寸
		}shirt;
	};
};

  
  

二、枚举

2.1、枚举类型的声明

  C语言中枚举是什么?没错,就是你想的那个枚举
  枚举就是一一列举
  把可能的取值一 一列举
  当然,一 一列举的前提是他是有限个数
  
比如:

  • 一周的天数是有限的,7天,可以一一列举
  • 性别有:男、女、保密,可以一一列举
  • 三原色,可以一一列举
      

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

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

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

enum Coloe//颜色
{
	RED,
	GREEN,
	BLUE
};

  
  上述定义的 e n u m enum enum D a y Day Day e n u m enum enum S e x Sex Sex e n u m enum enum C o l o r Color Color 就是枚举类型
  而{}中的内容就是可能的取值,也叫枚举常量
  这些可能取值都是有值的,默认从 0 开始,依次往后递增 1
  
当然,我们定义枚举类型时,也可以自己给它赋初值

enum Coloe//颜色
{
	RED = 2,
	GREEN = 4,
	BLUE = 8
};

  
  

2.2、枚举类型的优点

  我们可以用 # d e f i n e define define 为什么还要用枚举呢?
  
相比与 # d e f i n e define define,枚举有以下优点

  • 增加代码的可读性可维护性
  • 和 # d e f i n e define define 定义的标识符相比,枚举类型有类型检查,更加严谨
  • 便于调试,预处理阶段会替换 # d e f i n e define define 定义的符号
  • 方便使用,一次可定义多个常量
  • 枚举常量是遵从作用域规则的,枚举声明在函数范围内,只能在该函数内部使用。
      

枚举类型的使用

enum Color//颜色
{
	RED=1,
	GREEN=2,
	BLUE=4
};

enum Color clr = GREEN;//使用枚举常量给枚举变量赋值

  那我们不禁想:是否可以拿整数给枚举常量赋值呢?在 C语言 中是可以的,但是在 C++ 是不行的,C++ 的类型检查比较严格。
  
  
  
  


  好啦,本期关于联合体与枚举的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!

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

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

相关文章

CPLEX+YALMIP安装(matlab调用)

通过百度网盘分享的文件&#xff1a;yalmipc… 链接:https://pan.baidu.com/s/1wwYDu9bHFPmcCg5vD2pSXg?pwd9d1r 提取码:9d1r 复制这段内容打开「百度网盘APP 即可获取」 基于MATLAB的Cplex、Yalmip环境安装_如何安装给matlab安装cplex-CSDN博客 具体安装步骤可以参考这篇博…

模拟实现小米商城(有源码)

项目介绍 这是一个只有前端没有后端的项目, 适合于基础前端课设.该前端项目没有花里胡哨的特效, 纯手写 HTML CSS JS, 特别适合基础小白入门, 或者做为基础的课设(含有组员介绍页面), 此项目中, 充分使用 flex 布局, 绝对 相对定位, css 动画, 封装公共样式区域, 代码风格及命…

使用fitten code插件(vscode),替换通义千问,识别需求中的输入输出

今天我们介绍一个工具,具体介绍可以参考我的这篇文章的介绍,支持vs code 插件,Fitten Code是一款由非十科技开发的AI代码助手,旨在通过大模型驱动来提升编程效率和体验-免费神器-CSDN博客https://blog.csdn.net/lijigang100/article/details/137833223?spm=1001.2014.3001…

图像处理之PCA(C++)

图像处理之PCA&#xff08;C&#xff09; 文章目录 图像处理之PCA&#xff08;C&#xff09;前言一、PCA原理1.原理思想2.实现步骤 二、代码实现总结 前言 在科研、工程应用中&#xff0c;我们往往所获取的数据都包含着很多冗余的信息&#xff0c;这些冗余的信息会对我们分析数…

ubuntu22.04:软件包 wps-office 需要重新安装,但是我无法找到相应的安装文件

错误原因&#xff1a;手动在wps官网上下载的linux deb版本的wps2019,想卸载但是一直报错 解决办法&#xff1a;执行如下命令 sudo rm -rf /var/lib/dpkg/info/wps-office*sudo dpkg --remove --force-remove-reinstreq wps-office 说明&#xff1a; sudo命令是以root执行&…

word文件名和创建时间可以同时提取出来吗?答案是肯定的!方法很简单 一键就搞定

在日常生活和工作中&#xff0c;我们经常需要处理大量的Word文件&#xff0c;有时候需要提取这些文件的文件名以及它们的创建时间。虽然这听起来可能是一个复杂的任务&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0c;我们可以轻松地完成这一任务。在本文…

tkinter/python:第一个GUI程序——制作一个数据录入界面

下图是在网上搜寻的一个案例图样&#xff0c;经过了调整修改&#xff0c;登录时界面图如下&#xff1a; 登录后点击百货店铺按钮&#xff0c;界面如下 一、创建root窗口&#xff1a; geometry接收一个字符串&#xff0c;也就是需要建立的窗口尺寸和位置&#xff0c;geometry(…

跨境电商日报:虾皮开设新物流中心;Tk Shop菲律宾调整佣金费率

2024年5月7日跨境电商日报目录&#xff1a; 1.Shopee开设新物流中心&#xff1b; 2.TikTok Shop菲律宾站调整佣金费率&#xff1b; 3.野莓海外仓卖家可以销售9公斤以上商品&#xff1b; 4.亚马逊一季度净销售额同比增长13%&#xff1b; 5.巴西对华二氧化钛启动反倾销调查 …

AIGC (AI-Generated Content) 技术深度探索:现状、挑战与未来愿景

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f916; AIGC技术&#xff1a;塑造未来的创意与内容革命 &#x1f31f;引言 &#x1f680;AIGC技术发展现状 &#x1f4c8;核心技术驱动 &#x1f4a1;应用领域拓展 &#x1f310; 面临的挑战 ❌真实性与伦理考量 &am…

王春城:精益变革对于组织的长期发展有什么好处?

众所周知&#xff0c;精益变革不仅仅是一种管理方法的改进&#xff0c;更是一种思维方式的转变&#xff0c;旨在消除浪费、提高效率和持续改进。那么&#xff0c;精益变革对于组织的长期发展究竟有什么好处呢&#xff1f;下面天行健王春城老师将从多个方面详细阐述。 首先&…

怎么制作地图位置二维码?扫码获取地图信息的方法

随着互联网的不断发展&#xff0c;二维码在工作和生活中的应用不断的增多&#xff0c;可以针对不同的用途展示内容。比如现在很多的商家或者店铺会将定位定制生成二维码&#xff0c;印刷到传单或者宣传海报上&#xff0c;就可以让用户通过扫码获取位置&#xff0c;方便精准定位…

MetaCRM upload 任意文件上传漏洞

文章目录 漏洞描述漏洞原理漏洞复现修复建议 漏洞描述 北京美特软件技术有限公司&#xff08;以下简称“美特软件”&#xff09;是一家专业的客户关系管理软件提供商。 美特软件MetaCrm存在文件上传漏洞&#xff0c;攻击者可利用该漏洞上传任意恶意文件。 漏洞原理 在系统u…

密室逃脱游戏-第12届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第58讲。 密室逃脱游戏&…

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

揭秘CDO首席数据官选用机制:企业如何找到最合适的数据领袖?

随着大数据时代的到来&#xff0c;数据已成为企业最宝贵的资源之一。为了有效管理和利用这些数据&#xff0c;越来越多的企业开始设立首席数据官&#xff08;CDO&#xff09;这一职位。首席数据官不仅负责企业数据的战略规划和治理&#xff0c;还要推动数据驱动的业务决策。那么…

性能测试常见风险以及消减措施

性能测试过程中会遇到各种各样的风险&#xff0c;常见风险以及消减措施有哪些&#xff1f; 一&#xff1a; 时间 一&#xff09;时间相关风险 时间相关风险不仅限于最终用户满意度,尽管这是大多数人首先想到的。时间也是某些与业务和数据相关的风险因素。性能测试可以解决的…

【前端】前端数据本地化的多种实现方式及其优劣对比

前端数据本地化的多种实现方式及其优劣对比 在现代Web开发中&#xff0c;提高页面响应速度和改善用户体验是核心目标之一。数据本地化是其中一种实现方式&#xff0c;它通过在客户端存储数据来减少服务器请求&#xff0c;从而加快数据载入速度和改善用户的体验。本文将介绍前端…

【JS】call和 apply函数的详解

JavaScript 中 call() 和 apply() 函数的详解 在JavaScript中&#xff0c;call()和apply()都是非常重要的方法&#xff0c;用于调用函数时指定函数体内的this的值&#xff0c;从而实现不同对象之间的方法共享。尽管它们的功能非常相似&#xff0c;但在实际使用中各有其优势和特…

Jupyter Notebook输入python代码没智能提示

1、在Jupyter中打开控制台 2、再控制台中执行以下两个命令&#xff1a; pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user pip install jupyter_contrib_nbextensions命令需要下载文件&#xff0c;请耐心等待。 3、执行完成后&#xff0…

【正点原子Linux连载】 第四十章 Linux网络驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…