c语言中的联合体和枚举

这篇文章总结一下c语言中的联合体和枚举。看看这两个东西到底是什么。大家一起学习。

文章目录

  • 一、联合体
    • 1.联合体类型的声明。
    • 2.联合体的大小。
    • 3.相同成员的结构体和联合体对比
    • 4.联合体大小的计算。
  • 二、枚举类型
    • 1.枚举类型的声明。
    • 2.枚举类型的优点。
    • 枚举类型的使用。

一、联合体

1.联合体类型的声明。

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

#include <stdio.h>
 //联合类型的声明
 union Un
 {
 	char c;
 	int i;
 };
 int main()
 {
 	//联合变量的定义
	union Un un = {0};
 	//计算连个变量的⼤⼩
 	printf("%d\n", sizeof(un));
 	return 0;
 	};

输出结果为4。
在这里插入图片描述
char c 和int i共同处于一个空间当中,字节长度为最大的int类型占四个字节。

2.联合体的大小。

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

#include <stdio.h>
 //联合类型的声明
 union Un
 {
 	char c;
 	int i;
 };
 int main()
 {
 	//联合变量的定义
 	union Un un = {0};
 	// 下⾯输出的结果是⼀样的吗?
 	printf("%p\n", &(un.i));
 	printf("%p\n", &(un.c));
 	printf("%p\n", &un);
	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;
 }
 

在这里插入图片描述
这个代码输出后第四个字节的位置变成了55。下面画一个图解释。
在这里插入图片描述
因为是联合体,联合体共用一块内存空间。int 类型占四个字节,char类型占一个字节。un.c是char的首地址替换了un.i的首地址。

3.相同成员的结构体和联合体对比

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

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

结构体和联合体在内存中储存方式是不一样的。
在这里插入图片描述
这是结构体所占的内存。
在这里插入图片描述
这是联合体所占的内存。

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

输出结果是8和16。
Un1因为联合的大小最少是最大成员的大小,char c[5]是5个字节,但是因为当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍数,所以最大对齐数必须是4的整倍数为8。
Un2 short[7]是14个字节,最大成员的大小是14,此时最大成员大小不是最大对齐数的整倍数对齐到最大对齐数的整倍数,最大对齐数必须是4的整倍数是16。

根据上面所讲内容可以看出联合体是可以节省空间的。
⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

  1. 图书:书名、作者、⻚数
  2. 杯⼦:设计
  3. 衬衫:设计、可选颜⾊、可选尺⼨

如果单纯用结构体

 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;//商品类型
  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;
 };

二、枚举类型

1.枚举类型的声明。

枚举顾名思义就是⼀⼀列举。
把可能的取值⼀⼀列举。
在我们现实生活中:

  1. ⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
  2. 性别有:男、⼥、保密,也可以⼀⼀列举
  3. ⽉份有12个⽉,也可以⼀⼀列举
  4. 三原⾊,也是可以意义列举
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,当然在声明枚举类型的时候也可以赋初值。

2.枚举类型的优点。

我们可以使⽤#define 定义常量,为什么⾮要使⽤枚举?
枚举的优点:

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

枚举类型的使用。

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

那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。

到这里联合体和枚举的总结就结束了,谢谢大家观看。

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

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

相关文章

gitee规范团队 代码提交

1.团队开会规范 使用 插件 &#xff1a; git Commit Message Helper 插件进行代码提交前规范 2.gitee代码仓库断控制&#xff0c;上面只是规范了程序员开发端&#xff1b;但是gitee也要管理控制&#xff1b;正则根据每个公司的不同来进行。

民航电子数据库:CAEMigrator迁移数据库时总是卡死

目录 一、场景二、异常情况三、排查四、应急方案 一、场景 1、对接民航电子数据库 2、将mysql数据库迁移到cae数据库 3、使用CAEMigrator迁移工具进行数据库迁移时&#xff0c;该工具会卡死&#xff08;不清楚是否是部署cae服务的服务器资源导致&#xff09; 二、异常情况 …

iOS - Runloop介绍

文章目录 iOS - Runloop介绍1. 简介1.1 顾名思义1.2. 应用范畴1.3. 如果没有runloop1.4. 如果有了runloop 2. Runloop对象3. Runloop与线程4. 获取Runloop对象4.1 Foundation4.2 Core Foundation4.3 示例 5. Runloop相关的类5.1 Core Foundation中关于RunLoop的5个类5.2 CFRunL…

报错[Vue warn]: $listeners is readonly. $attrs is readonly.怎么解决?

代码也没有逻辑错误&#xff0c;但是报错 [Vue warn]: $listeners is readonly. $attrs is readonly. 情况1&#xff1a;多处声明了new Vue&#xff0c;解决方案&#xff1a;删除一个&#xff0c;用全局变量引用同一个Vue 情况2&#xff1a;import Vue from Vue;第二个Vue首字…

跳跃游戏-java

题目描述: 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想: …

蓝桥OJ 3500阶乘求和(找规律)

阶乘求和 做这道题两个循环到202320232023肯定会超时间。 但是可以发现算到将近40的阶乘时&#xff0c;后9位的答案就已经可以确定了。 #include<bits/stdc.h> using namespace std; using ll long long; const ll p 1e9; int main() {ll res 0;for (int i 1; i &l…

真实sql注入以及小xss--BurpSuite联动sqlmap篇

前几天漏洞检测的时候无意发现一个sql注入 首先我先去网站的robots.txt去看了看无意间发现很多资产 而我意外发现admin就是后台 之后我通过基础的万能账号密码测试or ‘1‘’1也根本没有效果 而当我注入列的时候情况出现了 出现了报错&#xff0c;有报错必有注入点 因此我…

数据结构——线性表(二)

线性表顺序存储结构的优缺点 优点:1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间 2.可以快速的存取表中的任一位置的元素 缺点:1.插入和删除操作需要移动大量的元素 2.当线性表长度变化较大的时候,难以确定存储空间的容量 3.造成存储空间的"碎片" 所以…

Golang线上内存爆掉问题排查(pprof)

Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; 1 问题描述 某天&#xff0c;售后同事反馈&#xff0c;我们服务宕掉了&#xff0c;客户无法预览我们的图片了。 我们预览图片是读取存储在我们S3服务的数据&#xff0c;然后返回给前端页面展示。因为客户存在几百M的…

【Python】你真的了解爬虫吗?初识爬虫

什么是爬虫&#xff1f; 简单来说&#xff1a;代替人去模拟浏览器进行网页操作。 它能解决什么问题&#xff1f; 自动高效地获取互联网中我们感兴趣的信息并为我们所用。 即&#xff1a;为其他程序提供数据源 如搜索引擎(百度、Google等)、数据分析、大数据等等。 爬虫的分…

基于MS的水分子径向分布函数(RDF)计算

​​​​​​ 构建水分子结构 新建一个3D Atomistic.xsd文件&#xff0c;命名为H2O&#xff0c;点击 新建水分子结构。 图1 水分子构建 构建AC模型 步骤如下图所示&#xff0c;单击选择Modules中的Amorphous Call&#xff0c;Calculation&#xff1b;计算精度Quality选择 U…

python爬虫之selenium4使用(万字讲解)

文章目录 一、前言二、selenium的介绍1、优点&#xff1a;2、缺点&#xff1a; 三、selenium环境搭建1、安装python模块2、selenium4新特性3、安装驱动WebDriver驱动选择驱动安装和测试 基础操作1、属性和方法2、单个元素定位通过id定位通过class_name定位一个元素通过xpath定位…

首页HF粗排模型优化

[work rus_env]$ pwd /home/work/xx/du-rus/offline-tools/du_rus/rus_env [work rus_env]$ python buildenv_rus.py 5a0e771e938a486df3b8b3e1cde1a39c2006882d 5f3241963a3e39a8e1eae05d7075fc5b9278a7c7 打开日志级别 [workxx conf]$ vim /home/work/xx/du-rus/du_rus_…

代码随想录算法训练营DAY11|C++栈和队列Part.2|LeetCode:20.有效的括号、 1047.删除字符串中所有相邻重复项、150.逆波兰表达式

文章目录 20.有效的括号思路CPP代码 1047.删除字符串中所有相邻重复项思路CPP代码 150.逆波兰表达式思路什么是逆波兰表达式本题的思路 CPP代码 20.有效的括号 力扣题目链接 文章链接&#xff1a;20.有效的括号 视频链接&#xff1a;LeetCode&#xff1a;20. 有效的括号 状态&a…

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍&#xff0c;将它与action自动化流程结合&#xff0c;可以实现一些小游戏 例如&#xff1a;2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

搜索与图论——Prim算法求最小生成树

在最小生成树问题里&#xff0c;正边和负边都没问题 朴素版prim算法 时间复杂度O(n^2) 生成树&#xff1a;每一次选中的t点&#xff0c;它和集合的距离对应的那条边&#xff0c;就是生成树的一条边 算法流程和dijkstra算法非常相似 #include<iostream> #include<cs…

浏览器工作原理与实践--栈空间和堆空间:数据是如何存储的

对于前端开发者来说&#xff0c;JavaScript的内存机制是一个不被经常提及的概念 &#xff0c;因此很容易被忽视。特别是一些非计算机专业的同学&#xff0c;对内存机制可能没有非常清晰的认识&#xff0c;甚至有些同学根本就不知道JavaScript的内存机制是什么。 但是如果你想成…

039—pandas 不规则表头转换为规整DataFrame

使用步骤 读入数据 代码如下&#xff08;示例&#xff09;&#xff1a; import pandas as pd import numpy as np df pd.DataFrame({0: [姓名, 性别],1: [张三, 男],2: [年龄,np.nan],3: [18,np.nan]}) dfdf.values.reshape([4,2])r len(df.columns)(pd.DataFrame(df.valu…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…