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++的类型检查⽐较严格。

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++王牌结构hash:哈希表开散列(哈希桶)的实现与应用

目录 一、开散列的概念 1.1开散列与闭散列比较 二、开散列/哈希桶的实现 2.1开散列实现 哈希函数的模板构造 哈希表节点构造 开散列增容 插入数据 2.2代码实现 一、开散列的概念 开散列法又叫链地址法(开链法)&#xff0c;首先对关键码集合用散列函数计算散列地址&…

一文教你如何轻松领取腾讯云优惠券

腾讯云作为国内领先的云计算服务商&#xff0c;为用户提供了丰富的云产品和服务。为了让更多用户享受到腾讯云服务的优质体验&#xff0c;腾讯云推出了各种优惠券&#xff0c;让用户在购买云服务时能够获得更多实惠。本文将为大家详细介绍如何轻松领取腾讯云优惠券&#xff0c;…

智慧公厕,为智慧城市建设注入了新的活力

随着智慧城市的快速发展&#xff0c;公共厕所不再是简单的功能设施&#xff0c;而是成为了提升城市形象、改善民生服务的重要一环。智慧公厕作为新形态的公共厕所&#xff0c;通过精准监测公厕内部的人体活动状态、人体存在状态、空气质量情况、环境变化情况、设施设备运行状态…

使用PopLDdecay软件绘制LD衰减图

前记 PopLDdecay是一款用于进行种群遗传学和关联分析的软件。它可以在全基因组水平上进行基因型数据的相关性和衰减分析&#xff0c;帮助研究人员探索种群间的遗传差异和突变选择的模式。 使用PopLDdecay可以实现以下功能&#xff1a; 遗传距离的计算&#xff1a;可以计算遗…

bugku-web-eval

页面源码 <code><span style"color: #000000"> <span style"color: #0000BB"><?php <br /> </span><span style"color: #007700">include </span><span style"color: #DD0000"&…

37-巩固练习(一)

37-1 if语句等 1、问&#xff1a;输出结果 int main() {int i 0;for (i 0; i < 10; i){if (i 5){printf("%d\n", i);}return 0;} } 答&#xff1a;一直输出5&#xff0c;死循环 解析&#xff1a;i5是赋值语句&#xff0c;不是判断语句&#xff0c;每一次循…

类与对象中C++

加油&#xff01;&#xff01;&#xff01; 文章目录 前言 一、类的6个默认成员函数 ​编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…

gitee规范团队 代码提交

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

基于Springboot+vue的宠物销售商城网站

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;宠物销售商城当然也不能排除在外。宠物销售商城是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#x…

【目录整理】(五)

​​​​​Git 基础 Git 详细安装教程文章浏览阅读10w次&#xff0c;点赞9.6k次&#xff0c;收藏1.7w次。Git 是个免费的开源分布式版本控制系统&#xff0c;下载地址为git-scm.com 或者 gitforwindows.org&#xff0c;本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…

力软框架打开新的对话框,点击对话框确认按钮的事件AcceptClick的方法

// 原来在力软框架下&#xff0c;点击哪个确认按钮的时候 top.frames[iframeId].AcceptClick直接用这个方法就可以了 &#xff0c;那个方法是直接返回方法的但是不知道是什么情况。如图二所示。死活就返回了ifram标签不知道是什么原因&#xff0c;就获取不到对话框里边自己定义…

故障诊断 | 基于FTNN网络模型的故障诊断(Pytorch)

效果分析 基本介绍 FTNN是一种基于神经网络的故障诊断模型,它旨在识别和定位系统中的故障。使用已标记的数据集对FTNN模型进行训练。标记的数据集包括系统在正常和故障状态下的数据,以及对应的故障标签。通过算法和优化方法,调整网络参数以最小化预测误差。使用独立的测试数…