c语言-枚举和联合体

news2024/11/15 13:26:30

文章目录

  • 前言
  • 一、枚举类型
    • 1.1 枚举类型的定义
    • 1.2 枚举类型的使用
    • 1.3 枚举的优点
  • 二、联合体类型
    • 2.1 联合体类型的定义
    • 2.2 联合体类型的特点
    • 2.3 联合体大小的计算
  • 总结


前言

本篇文章介绍c语言中的枚举类型和联合体类型

一、枚举类型

1.1 枚举类型的定义

枚举类型和结构体类型相似,都是一种自定义类型。
定义枚举类型的关键字:enum
枚举类型的定义格式

enum 枚举名
{
	枚举元素1,
	枚举元素2,
	...
};

例如,定义一个星期作为枚举类型

enum WEEK
{
	Mon,
	Tues,
	Wed,
	Thus,
	Fri,
	Sat,
	Sun
};

枚举类型的第一个成员的取值默认为0,依次往后递增1,
输出枚举WEEK每个成员的值
在这里插入图片描述

修改枚举类型成员的默认值

enum WEEK
{
	Mon = 1, //修改默认值为1
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

输出修改后枚举WEEK每个成员的值
在这里插入图片描述

1.2 枚举类型的使用

在这里插入图片描述
把一个整型值赋值为枚举类型变量

	int a = 1;
	enum WEEK day;
	day = (enum WEEK)a; //类型转换

1.3 枚举的优点

  1. 增加代码的可读性和可维护性
  2. 与#define定义的标识符相比,枚举有类型检查,更加严谨
  3. 防止命名污染
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

二、联合体类型

2.1 联合体类型的定义

联合体类型也是一种自定义类型
定义联合体类型的关键字:union
联合体类型定义的格式

union 联合体名
{
	类型1 成员名;
	类型2 成员名;
	...
};

例如,定义一个联合体类型Un

union Un
{
	int i;
	char c;
};

联合体类型与结构体类型,枚举类型相似,也可以定义匿名联合体,例如

//定义一个匿名联合体
//定义匿名联合体时,和匿名结构体类型,必须同时定义匿名联合体变量
//my_union就是匿名联合体类型变量
union
{
	int i;
	char c;
}my_union;

2.2 联合体类型的特点

联合体的成员共用一块内存空间,因此也称联合体为共用体。
定义一个联合体

union Un
{
	int i;
	char c;
};

输出联合体Un的大小
在这里插入图片描述
输出联合体成员的地址
在这里插入图片描述
由输出结果可知,联合体u的成员i的地址和成员c的地址相同,说明两个成员指向同一块空间的起始位置,共用一块空间。

联合体u的内存情况如下
在这里插入图片描述

练习:使用联合体判断大小端

代码实现

int check_sys()
{
	union  //定义匿名联合体
	{
		int i;
		char c;
	}uu;

	uu.i = 1;
	//1的16进制形式 0x00000001
	//低地址->高地址(32位机器)
	//大端字节序 00 00 00 01  
	//小端字节序 01 00 00 00 
	//uu.c = 0 则为大端字节序
	//uu.c = 1 则为小端字节序
	return uu.c;
}

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


2.3 联合体大小的计算

  • 当联合体的最大成员是最大对齐数的整数倍,则联合体大小等于最大成员的大小
union Un
{
	int i;
	char c;
};

联合体Un的最大成员为4个字节,联合体的最大对齐数为4,那么i的大小即为联合体的大小

  • 当联合体的最大成员不是最大对齐数的整数倍时,则联合体大小需对齐到最大对齐数的整数倍
union Un_2
{
	char str[5];
	int i;
};

分析联合体大小:

联合体成员 char str[5],大小为5个字节
当成员为数组时,数组的对齐数为元素类型的大小,vs默认对齐数为8
则str的对齐数为1
联合体成员int i ,大小为4个字节 ,vs默认对齐数为8
则i的对齐数4
联合体的最大对齐数为4
联合体的最大成员为5个字节,不是最大对齐数的整数倍
则联合体大小对齐到8个字节

输出联合体大小:

在这里插入图片描述


总结

本篇文章首先介绍c语言的枚举类型定义以及枚举类型的使用;最后介绍联合体类型的定义、联合体的特点以及如何计算联合体的大小。

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

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

相关文章

【C++干货铺】C++中的四种类型转换

个人主页点击直达:小白不是程序员 C系列专栏:C干货铺 代码仓库:Gitee 目录 C语言中的类型转换 为什么C需要四种类型转化 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast RTTI C语言中的类型转换 在C语言中&…

2023 IoTDB Summit:中核武汉核电运行技术股份有限公司主管工程师方华建《IoTDB在核电数字化转型过程的应用实践》...

12 月 3 日,2023 IoTDB 用户大会在北京成功举行,收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题,多位学术泰斗、企业代表、开发者,深度分享了工业物联网时序数据库 IoTDB 的技术创新…

ERP读书笔记20240125-1

ERP(Enterprise Resource Planning,企业资源计划)的发展经历了从 MRP(Material Requirements Planning,物料需求计划)到 MRP2(Manufacturing Resources Planning,制造资源计划&#…

OpenCV-26 拉普拉斯算子

一、拉普拉斯算子概念及其推导 索贝尔算子是模拟一阶导数,一阶导数越大的地方说明变化越剧烈,越有可能是边缘。 但是如果我们对f(t)求二阶导数呢? 可以发现边缘处的二阶导数 0,因此,我们可以利…

跟着cherno手搓游戏引擎【10】使用glm窗口特性

修改ImGui层架构: 创建: ImGuiBuild.cpp:引入ImGui #include"ytpch.h" #define IMGUI_IMPL_OPENGL_LOADER_GLAD//opengl的头文件需要的定义,说明使用的是gald #include "backends/imgui_impl_opengl3.cpp" …

C++力扣题目56--合并区间 738--单调递增的数字 968--监控二叉树

56. 合并区间 力扣题目链接(opens new window) 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: interv…

Netty的解码器和编码器

链路图 一个完整的RPC请求中,netty对请求数据和响应数据的处理流程如下图所示 网络线路中传输的都是二进制数据,之后netty将二进制数据解码乘POJO对象,让客户端或者服务端程序处理。 解码的工具称为解码器,是一个入站处理器InBo…

分布式应用程序设计项目管理

1. 项目的定义 项目是一种特定的、新颖的行动,目的是以有条不紊、逐步的方式构建一个尚未存在确切对应物的未来现实。它是对精心制定的需求的回应,旨在满足业主的需要。项目包括一个可能是物理或智力的目标,并且需要使用给定的资源来执行一系…

Gold-YOLO(NeurIPS 2023)论文与代码解析

paper:Gold-YOLO: Efficient Object Detector via Gather-and-Distribute Mechanism official implementation:https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO 存在的问题 在过去几年里,YOLO系列已经…

某马头条——day10

热文章数据查询 分布式任务调度xxl-job 概述 环境搭建 docker化部署 docker run -p 3306:3306 --name mysql57 \ -v /opt/mysql/conf:/etc/mysql \ -v /opt/mysql/logs:/var/log/mysql \ -v /opt/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDroot\ -d mysql:5.7 dock…

uniapp开发过程一些小坑

问题1、uniapp使用scroll-view的:scroll-into-view“lastChatData“跳到某个元素id时候,在app上不生效,小程序没问题 使用this.$nextTick或者 setTimeout(()>{that.lastChatData 元素id },500) 进行延后处理就可以了。 问题2:uniapp开…

NE8实现HTTP Upgrade和HTTP CONNECT代理服务器

看到一个文章[Go] 不到 100 行代码实现一个支持 CONNECT 动词的 HTTP 服务器 在NET8中如何实现 创建项目为MiniApi 编辑Program.cs文件。 var builder WebApplication.CreateSlimBuilder(args);var app builder.Build();// 将HTTP请求通过协议升级机制转为远程TCP请求&…

02 分解质因子

一、数n的质因子分解 题目描述&#xff1a; 输入一个数n&#xff08;n<10^6&#xff09;,将数n分解质因数&#xff0c;并按照质因数从小到大的顺序输出每个质因数的底数和指数。 输入 5 输出 5 1 输入 10 输出 2 1 5 1 朴素解法&#xff1a; 首先求出1~n的所有质数…

༺༽༾ཊ—Unity之-02-简单工厂模式—ཏ༿༼༻

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务&#xff1a;使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…

Git 入门精讲

我们为什么要学习git&#xff1f; 就当下的发展而言&#xff0c;只要你从事开发就一定会接触git。作为最强大的分布式版本控制器&#xff0c;git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统&#xff0c;每个开发者都可以在本地维护完整的代码库&#xff0c;可以离…

第21课 在Android Native开发中架起java与c++互通的桥梁

在开始本节课&#xff0c;我尝试把项目拷贝到另一台电脑上以便继续工作&#xff0c;但出现了大量的“could not be resolved”问题&#xff0c;尝试包含新的include路径也无法解决该问题&#xff0c;最后删除了项目的Native Support&#xff0c;然后重新添加Native Support才解…

HarmonyOS鸿蒙学习基础篇 - Text文本组件

该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Text文本组件是可以显示一段文本的组件。该组件从API Version 7开始支持&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 子组件 可…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中&#xff0c;需要用深度学习模型…

上门服务小程序|预约上门服务系统开发有哪些功能?

在现代快节奏的生活中&#xff0c;压力和疲劳常常困扰着我们。为了缓解这种状况&#xff0c;越来越多的人选择去按摩店进行放松。然而&#xff0c;繁忙的工作和家庭责任往往让我们无法抽出时间去按摩店。在这种情况下&#xff0c;上门按摩服务应运而生。而随着科技的发展&#…

VI / VIM的使用

vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容 vi 的所有指令&#xff0c;而且 还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于 x win…