你真的了解C语言的枚举和联合吗~

news2024/11/18 6:02:29

目录

  • 1. 枚举
    • 1.1 枚举类型的定义
    • 1.2 枚举的优点
    • 1.3 枚举的使用
  • 2. 联合(共用体)
    • 2.1 联合类型的定义
    • 2.2 联合的特点
    • 2.3 使用联合体判断当前机器的大小端
    • 2.4 联合大小的计算

1. 枚举

枚举顾名思义就是一一列举。
把可能的取值一一列举。

比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举。
性别有:男、女、保密,也可以一一列举。
月份有12个月,也可以一一列举。
三原色,也是可以意义列举。
这些数据的表示就可以使用枚举了。

1.1 枚举类型的定义

枚举类型的定义与结构体是十分类似的:

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

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

};

以上定义的enum Day,enum Sex都是枚举类型。

  • {}大括号里的内容是枚举类型的可能取值,叫做枚举常量
  • 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
  • 别漏了逗号
#include <stdio.h>

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

int main()
{
	printf("%d\n", Mon);
	printf("%d\n", Tues);
	printf("%d\n", Wed);
	printf("%d\n", Thur);
	printf("%d\n", Fri);
	printf("%d\n", Sta);
	printf("%d\n", Sun);

	return 0;
}

输出结果:

在这里插入图片描述
如果给它们赋初值:

#include <stdio.h>

enum Sex//性别
{
	MALE=2,
	FEMALE,
	SECRET,

};

int main()
{
	printf("%d\n", MALE);
	printf("%d\n", FEMALE);
	printf("%d\n", SECRET);
		
	return 0;
}

输出结果:
在这里插入图片描述

1.2 枚举的优点

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

1.3 枚举的使用

#include <stdio.h>

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

int main()
{
	enum Day d = Mon;//使⽤枚举常量给枚举变量赋值

	return 0;
}

2. 联合(共用体)

联合也是一种特殊的自定义类型。
这种类型自定义的变量也包含一系列成员,特征是这些成员共用同一块空间(所以联合也叫共用体)。

2.1 联合类型的定义

跟结构体一样,联合也是由一个或多个成员构成,这些成员可以是不同的类型。

其类型声明和变量定义如下:

#include <stdio.h>

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

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

输出结果:
在这里插入图片描述
为什么是4呢?

2.2 联合的特点

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

思考下面的代码:

#include <stdio.h>

union Un
{
	int a;
	char c;
};

int main()
{
	union Un u = { 0 };

	printf("%p\n", &u);
	printf("%p\n", &(u.a));
	printf("%p\n", &(u.c));

	return 0;
}

在这里插入图片描述
三个地址一模一样。画图解释:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/265df13e4b734a9ba491bc9b73dcd9fa.png

  • 放在联合体中的成员并不是每个都有自己独立的空间的。
  • 所以联合体在一定程度上也节省了空间,使用联合体时必须保证每个成员是独立使用的。

例如上面的代码中,a和c只能独立使用,不能既使用a又使用c。

我们再使用一个例子来说明这个特点:

#include <stdio.h>

union Un
{
	int i;
	char c;
};


int main()
{
	union Un u;
	u.i = 0x11223344;
	u.c = 0x00;

	return 0;
}

在这里插入图片描述
如监视内存所示,正是由于a和c共用一块地址,改变a的同时c也会变化。

画图解释如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/819d46eb50cf49b9ba206c9b5e7ab2cf.png

2.3 使用联合体判断当前机器的大小端

(注:若不了解什么是大小端,请移步我的主页浏览相关文章~

#include <stdio.h>

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

int main()
{
	int ret = check_sys();
	
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");

	return 0;
}

思路画图解释如下:
在这里插入图片描述

2.4 联合大小的计算

对齐规则:

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#include <stdio.h>

union Un
{
	char arr[5];//5
	int a;//4
};

int main()
{
	printf("%zd\n", sizeof(union Un));

	return 0;
}

输出结果:
在这里插入图片描述

由对齐规则可知:该联合体的大小至少是5个字节,由于它们的最大对齐数是4,5不是4的整数倍,所以还要向后浪费空间,直到8个字节。

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

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

相关文章

华为云磁盘挂载

华为云磁盘挂载 磁盘挂载情况 fdisk -l 2. 查看当前分区情况 df -h 3.给新硬盘添加新分区 fdisk /dev/vdb 4.分区完成&#xff0c;查询所有设备的文件系统类型 blkid 发现新分区并没有文件系统类型&#xff08;type为文件系统具体类型&#xff0c;有ext3,ext4,xfs,iso9660等…

如何一步一步地优化LVGL的丝滑度

经过一番周折将LVGL移植到了STM32F407单片机上&#xff0c;底层驱动的LCD是st7789&#xff0c;移植时的条件和环境如下&#xff1a; ●LVGL用的是单缓冲&#xff0c;一次刷新10行&#xff1b; ●刷新函数用的是最原始的一个一个打点的方式&#xff1b; ●ST7789底层发送数据用的…

寒假开学在即,怎么寄行李才能便宜省钱呢?

在度过了一个充实愉快的假期之后&#xff0c;小伙伴们就要踏上新的征程了&#xff0c;来面对新学期的到来&#xff0c;可是&#xff0c;面对这么多不知道怎么安排的行李可就把人给愁死了&#xff0c;如果通过驿站寄行李的话&#xff0c;又要花费一大笔快递费了&#xff0c;可是…

IAudioManager.cpp源码解读

IAudioManager.cpp源码如下&#xff1a; 源码路径&#xff1a;https://cs.android.com/android/platform/superproject/main//main:frameworks/native/services/audiomanager/IAudioManager.cpp;drc84410fbd18148d422d3581201c67f1a72a6658c4;l147?hlzh-cn /** Copyright (C)…

基于springboot实现线上阅读系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现线上阅读系统演示 摘要 随着社会发展速度的愈来愈快&#xff0c;以及社会压力变化的越来越快速&#xff0c;致使很多人采取各种不同的方法进行解压。大多数人的稀释压力的方法&#xff0c;是捧一本书籍&#xff0c;心情地让自己沉浸在情节里面&#xff0c;以…

【Linux】TCP应用与相关API守护进程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 相关使用接口2. 代码实现2.1 日志组件2.2 Server端2.3 Client端2.3 bug解决 3. 守…

动态规划|【斐波那契数列模型 】|面试题08.01三步问题

目录 题目 思路 普通思路 动态规划思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 空间优化 题目 题目链接 面试题 08.01. 三步问题https://leetcode.cn/problems/three-steps-problem-lcci/ 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n…

【JAVA日志】关于日志系统的架构讨论

目录 1.日志系统概述 2.环境搭建 3.应用如何推日志到MQ 4.logstash如何去MQ中取日志 5.如何兼顾分布式链路追踪 1.日志系统概述 关于日志系统&#xff0c;其要支撑的核心能力无非是日志的存储以及查看&#xff0c;最好的查看方式当然是实现可视化。目前市面上有成熟的解决…

今天面试了一个工作4年的测试工程师,一问连自动化基础都不知道,还反过来怼我..

金三银四黄金期&#xff0c;我们公司也开始大量招人了&#xff0c;我这次是公司招聘的面试官之一&#xff0c;主要负责一些技术上的考核&#xff0c;这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽&#xff1a;这几个星期没有哪天不加班的&#xff01;各种…

LTD264次升级 | 对接AsiaPay • 人民币买外币商品 •知识付费订单可关闭 • 专栏支持VIP免支付购买

​ 1、对接AsiaPay第三方支付平台&#xff0c;支持人民币买外币商品&#xff1b; 2、知识付费购买优化 3、账号绑定的微信号可解除绑定&#xff1b; 4、其他已知问题修复与优化&#xff1b; 01 商城 1) 新增海外跨境支付系统AsiaPay 在本次升级中&#xff0c;商城支付系统新增…

【面试题】在浏览器地址栏输入URL后会发生什么

1. 地址栏输入后的本地操作 当我们在浏览器的地址栏中&#xff0c;输入xxx内容后&#xff0c;浏览器的进程首先会判断输入的内容&#xff1a; 如果是普通的字符&#xff0c;那浏览器会使用默认的搜索引擎去对于输入的xxx生成URL。如若输入的是网址&#xff0c;那浏览器会拼接…

StarRocks实战——滴滴OLAP的技术实践与发展方向

原文大佬的这篇StarRocks实践文章整体写的很深入&#xff0c;介绍了StarRocks数仓架构设计、物化视图加速实时看板、全局字典精确去重等内容&#xff0c;这里直接摘抄下来用作学习和知识沉淀。 目录 一、背景介绍 1.1 滴滴OLAP的发展历程 1.2 OLAP引擎存在的痛点 1.2.1 运维…

在 Jupyter Notebook 中查看所使用的 Python 版本和 Python 解释器路径

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 我们在做 Python 开发时&#xff0c;有时在我们的服务器上可能安装了多个 Python 版本。 使用 conda info --envs 可以列出所有的 conda 环境。当在 Linux 服务器上使用 which python 命令时&#xff0…

【数据结构与算法】回溯法解题20240229

【数据结构与算法】回溯法解题20240229 一、46. 全排列1、以[1,2,3]为例&#xff0c;抽象成树形结构2、回溯三部曲 二、LCR 084. 全排列 II1、以[1,1,2]为例&#xff0c;抽象成树形结构 三、面试题 08.07. 无重复字符串的排列组合四、面试题 08.08. 有重复字符串的排列组合 一、…

代码随想录-力扣刷题-总结笔记01

代码随想录&#xff1a;代码随想录力扣&#xff1a;力扣 (LeetCode) 全球极客挚爱的技术成长平台 目录 01、代码随想录 00、琐碎知识点 01、数组 02、链表 03、哈希表 04、字符串 05、双指针法 06、栈与队列 6.1、栈 6.2、队列 07、二叉树 7.1、前中后序-递归遍历 …

UTONMOS元宇宙游戏发展趋势是什么?

UTONMOS元宇宙游戏的发展趋势包括以下几个方面&#xff1a; 更加真实的体验&#xff1a;随着技术的进步&#xff0c;UTONMOS元宇宙游戏将提供更加逼真的视觉、听觉和触觉体验&#xff0c;让玩家更加身临其境。 社交互动&#xff1a;UTONMOS元宇宙游戏将越来越注重社交互动&am…

Premiere水墨风格婚纱照片婚礼视频模板|PR婚庆后期剪辑模板

时尚大气水墨风格婚纱照片展示&#xff0c;婚礼视频制作PR模板&#xff0c;婚庆后期剪辑模板MOGRT。 主要特点&#xff1a;高清&#xff08;19201080&#xff09;分辨率/30帧/秒&#xff0c;Premiere Pro 2022或更高版本软件&#xff0c;易于定制&#xff0c;持续时间00:50秒&a…

猫头虎分享已解决Bug || 虚拟网络问题(Virtual Network Issue):VirtualNetworkError, VNetFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…

陪诊小程序:温暖您的就医之路,让关怀触手可及

随着社会的进步和科技的发展&#xff0c;人们对于医疗健康的需求日益增长。然而&#xff0c;在繁忙的生活节奏中&#xff0c;许多人在面对就医时却面临着无人陪伴的困境。为了解决这一问题&#xff0c;陪诊小程序应运而生。 陪诊小程序是一种便捷、高效、人性化的医疗服务应用…