当前位置: 首页 > news >正文

自定义类型:联合和枚举

文章目录

    • 前言
    • 一、联合体类型的声明
      • 1.1 联合体类型的声明
      • 1.2 联合体的特点
      • 1.3 相同成员的结构体和联合体对比
      • 1.4 联合体大小的计算
      • 1.5 联合体的一个练习
    • 二、枚举类型的声明
      • 2.1 枚举类型的声明
      • 2.2 枚举类型的优点
      • 2.3 枚举类型的使用
        • 1. 用于 `switch` 语句
        • 2. 作为函数参数
    • 总结

前言

在 C 语言中,我们经常使用基本数据类型(如 intcharfloat 等)来存储数据。但有时候,我们需要自定义一些特殊的数据结构,以便更高效地管理和操作数据。这时,联合体(union)枚举(enum) 就派上了用场。

本文将从零基础的角度,详细介绍联合体和枚举的概念、特点以及如何使用它们。
在这里插入图片描述


一、联合体类型的声明

1.1 联合体类型的声明

联合体(union)和结构体(struct)类似,也是一种数据结构,可以存储不同类型的数据。但它的特点是,所有成员共享同一块内存,因此在同一时刻只能存储一个成员的值。

#include <stdio.h>union Data {int i;float f;char str[20];
};int main() {union Data data;data.i = 10;printf("data.i: %d\n", data.i);return 0;
}

1.2 联合体的特点

  • 所有成员共享同一块内存,大小取决于最大成员的大小。
  • 在同一时刻只能使用一个成员,赋值一个成员会覆盖之前的值。
  • 节省内存,适用于需要存储多个数据但不同时使用的场景。

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

#include <stdio.h>struct StructExample {int i;float f;char str[20];
};union UnionExample {int i;float f;char str[20];
};int main() {printf("结构体大小: %lu\n", sizeof(struct StructExample));printf("联合体大小: %lu\n", sizeof(union UnionExample));return 0;
}

输出示例(不同系统可能会有不同结果):

结构体大小: 28
联合体大小: 20

1.4 联合体大小的计算

联合体的大小等于 最大成员的大小,同时可能会受到 对齐方式 的影响。例如:

union Example {int a;  // 4 字节double b;  // 8 字节
};

该联合体的大小一般为 8 字节,因为 double 是最大成员。

1.5 联合体的一个练习

写一个程序,判断当前机器是大端还是小端?

#include <stdio.h>void checkEndian() {union {int i;char c;} test;test.i = 1;if (test.c == 1) {printf("当前机器是小端模式\n");} else {printf("当前机器是大端模式\n");}
}int main() {checkEndian();return 0;
}

解释

  • 通过 union 共享内存的特点,我们让 intchar 共享同一块空间。
  • 如果最低字节存的是 1,说明 char 访问的是 int 的低字节,表示 小端
  • 否则,表示 大端

二、枚举类型的声明

2.1 枚举类型的声明

枚举(enum)是一种 自定义整数类型,它可以用来表示一组 有意义的命名常量

#include <stdio.h>enum Color {RED,    // 0GREEN,  // 1BLUE    // 2
};int main() {enum Color myColor = GREEN;printf("我的颜色是: %d\n", myColor);return 0;
}

默认情况下,enum 的值从 0 开始递增,但也可以手动指定:

enum Status {SUCCESS = 1,FAILURE = -1,UNKNOWN = 0
};

2.2 枚举类型的优点

  • 代码可读性更高:用名字代替魔法数字,提高可维护性。
  • 避免随意定义数值:只允许枚举范围内的值。
  • 自动分配整数值,也可以手动指定。

2.3 枚举类型的使用

1. 用于 switch 语句
#include <stdio.h>enum Weekday {MON, TUE, WED, THU, FRI, SAT, SUN
};void printWeekday(enum Weekday day) {switch (day) {case MON: printf("今天是星期一\n"); break;case TUE: printf("今天是星期二\n"); break;case WED: printf("今天是星期三\n"); break;default: printf("今天不是周一到周三\n");}
}int main() {printWeekday(TUE);return 0;
}
2. 作为函数参数
void setMode(enum Mode m);

这样可以确保传入的值只能是 enum 内的定义。


总结

  • 联合体(union) 适用于需要节省内存、但不会同时使用所有成员的情况。
  • 枚举(enum) 适用于定义一组相关的整数常量,提高代码可读性。
  • 联合体共享内存,结构体独立存储,使用时要注意。
  • 枚举默认从 0 递增,但可以手动赋值。

通过本文的学习,希望你能更好地理解 联合体枚举,并在实际编程中灵活使用它们!

相关文章:

自定义类型:联合和枚举

文章目录 前言一、联合体类型的声明1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的一个练习 二、枚举类型的声明2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用1. 用于 switch 语句2. 作为函数参数 总结 前…...

注意力机制

实现了Bahdanau式加法注意力的核心计算逻辑。以下是三个线性层设计的完整技术解析&#xff1a; 一、数学公式推导 注意力分数计算流程&#xff1a; s c o r e ( h d e c , h e n c ) v T ⋅ tanh ⁡ ( W 1 ⋅ h e n c W 2 ⋅ h d e c ) score(h_{dec}, h_{enc}) v^T \cdot …...

OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)

1、先插好上电&#xff08;可正确识别&#xff09; 2、上电开机后插&#xff0c;报错如下&#xff0c;只能检测到USB2.0--480M&#xff0c;识别不到USB3.0-5Gbps&#xff0c;重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: reset high-speed…...

KubeVirt虚拟化管理架构

目录 一. KubeVirt简介 1.1 KubeVirt的价值 1.2 KubeVirt架构 1.3 KubeVirt组件 1.4 KubeVirt流程管理 KubeVirt实战 2.1 Kubevirt安装 2.1.1节点规划 2.1.2 环境准备 2.1.3 安装KubeVirt 2.1.4 安装CDI 2.1.5 安装virtctl命令工具 2.1.6 生成官方虚拟机 2.1.7 进…...

游戏引擎学习第202天

调试器&#xff1a;启用“跳转到定义/声明”功能 开始了一个完整游戏的开发过程&#xff0c;并分享了一些实用技巧。首先&#xff0c;讨论了如何在 Visual Studio 中使用“跳转到定义”和“跳转到声明”功能&#xff0c;但当前的项目并未启用这些功能&#xff0c;因为缺少浏览…...

sqlalchemy查询json

第一种&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…...

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、握手问题-&#xff08;解析&#xff09;-简单组合问题&#xff08;别人叫她 鸽巢定理&#xff09;&#x1f607;&#xff0c;感觉叫高级了…...

Linux系统之wc命令的基本使用

Linux系统之wc命令的基本使用 一、命令简介二、基本语法格式三、核心功能选项四、典型使用案例4.1 创建示例文件4.2 基础统计操作4.3 组合选项使用4.4 管道流处理 五、高级应用技巧4.1 递归统计代码行数4.2 统计CSV文件数据量4.3 监控日志增长速率4.4 字符与字节差异说明 七、命…...

SQL Server 2022 脏读问题排查与思考

总结sqlserver的使用&#xff0c;总是会回想起很多开发过程当中加班努&#xff08;拼&#xff09;力&#xff08;命&#xff09;的场景&#xff0c;今天&#xff0c;就把之前一个由于数据库脏读到这的OA系统员工请假流程状态不一致问题和解决思路分享一下。 业务场景描述 由于…...

Linux系统时间

1. Linux系统时间 jiffies是linux内核中的一个全局变量&#xff0c;用来记录以内核的节拍时间为单位时间长度的一个数值。 jiffies变量开机时有一个基准值&#xff0c;然后内核每过一个节拍时间jiffies就会加1。 一个时间节拍的时间取决于操作系统的配置&#xff0c;Linux系统一…...

【Windows批处理】命令入门详解

Windows 批处理&#xff08;Batch Script&#xff09;是一种用于在 Windows 操作系统上自动执行命令的脚本语言。它基于 Windows 命令提示符&#xff08;cmd.exe&#xff09;并使用 .bat 或 .cmd 文件格式。 一、批处理基础 1. 创建批处理文件 批处理脚本本质上是一组按顺序执…...

fpga系列 HDL:ModelSim 条件断点调试 modelsim支持的tcl语言

条件断点调试配置流程&#xff1a; 触发动作用tcl语言描述,modelsim支持的tcl语言见&#xff1a;https://home.engineering.iastate.edu/~zzhang/courses/cpre581-f08/resources/modelsim_quickguide.pdf 运行效果&#xff1a;...

Linux: network: 两台直连的主机业务不通

前提环境,有一个产品的设定是两个主机之间必须是拿网线直连。但是设备管理者可能误将设置配错,不是直连。 最近遇到一个问题,说一个主机发的包,没有到对端,一开始怀疑设定的bond设备的问题,检查了bond的设置状态,发现没有问题,就感觉非常的奇怪。后来就开始怀疑两个主机…...

虚拟地址空间布局架构

一、内存管理架构 1.Linux内核整体架构以及子系统 内存管理子系统架构分为用户空间、内核空间及硬件部分 3 个层面&#xff1a; 用户空间&#xff1a;应用程序使用malloc()申请内存资源&#xff0c;通过free()释放内存资源。内核空间&#xff1a;内核是操作系统的一部分&…...

在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置

你遇到的大部分ubuntu中配置hadoop的问题这里都有解决方法&#xff01;&#xff01;&#xff01;&#xff08;近10000字&#xff09; 概要 在Docker虚拟容器环境下&#xff0c;进行Hadoop-3.2.2分布式集群环境的配置与安装&#xff0c;完成基于Yarn模式的一个Master节点、两个…...

go day 01

go day 01 配置go环境 install go on D:\huang\lang\go\D:\huang\lang\go\bin\go xxx.go # D:\huang\lang\go\bin 设置到环境变量go go version# 创建任意一个目录,创建三个文件夹 # D:\huang\lang\goProject bin、pkg、src # 创建三个系统环境变量 GOROOT GOPATH GOBIN # GOR…...

(二)RestAPI 毛子(Tags)

文章目录 项目地址一、给Habit添加Tags1.1 创建Tags1. 创建一个新的HabitTags实体2. 设置Habit和Tags的关系3. 设置HabitTag表4. 在HabitConfiguration里配置5. 将表添加到EFCore里6. 迁移数据 1.2 给Habit增加/修改标签1. 创建UpsertHabitTagsDto2. 创建查询HabitWithTagsDto3…...

Elasticsearch:使用机器学习生成筛选器和分类标签

作者&#xff1a;来自 Elastic Andre Luiz 探索使用机器学习模型与传统硬编码方法在搜索体验中自动创建筛选器和分类标签的优缺点 筛选器和分类标签是用来优化搜索结果的机制&#xff0c;帮助用户更快速地找到相关内容或产品。在传统方法中&#xff0c;规则是手动定义的。例如…...

Python接口自动化测试之UnitTest详解

↵ 基本概念 UnitTest单元测试框架是受到JUnit的启发&#xff0c;与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化&#xff0c;配置共享和关机代码测试。支持将测试样例聚合到测试集中&#xff0c;并将测试与报告框架独立。 它分为四个部分test fixture、Te…...

《概率论与数理统计》期末复习笔记_上

目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…...

工程师 - Doxygen介绍

Code Documentation. Automated. Free, open source, cross-platform. Version 1.12.0 is now available! Release date: 7 August 2024 官方网址&#xff1a; Doxygen homepage 文档&#xff1a; Doxygen: Overview Github网址&#xff1a; https://github.com/doxygen/…...

开源且完全没有审核限制的大型语言模型的概述

开源且完全没有审核限制的大型语言模型的概述 关键要点 研究表明&#xff0c;存在多个开源的大型语言模型&#xff08;LLM&#xff09;完全没有审核限制&#xff0c;适合开放对话。包括基于 Llama、Mixtral、Phi-2 和 StableLM 的模型&#xff0c;参数范围从 2.78 亿到 4050 亿…...

Qt QTableView QAbstractTableModel实现复选框+代理实现单元格编辑

话不多说&#xff0c;直接看代码 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…...

2025.3.19

1、用vim编辑/etc/hosts文件&#xff0c;将本机和第二个虚拟机的ip地址和主机名写入该文件&#xff0c;然后ping 两个主机的主机名能否ping通&#xff1b; &#xff08;1&#xff09;在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...

GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议

蓝牙的 GATT&#xff08;Generic Attribute Profile&#xff09; 是蓝牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;简称BLE&#xff09;协议栈中的一个核心协议&#xff0c;用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT&#xff08;Attribute Proto…...

打造下一代智能体验:交互型 AI 的崛起与实践

在人工智能技术不断飞跃的今天&#xff0c;我们正迎来一个从"一问一答"向"多轮交互、智能反馈"转变的新时代——交互型 AI&#xff08;Interactive AI&#xff09;。 什么是交互型 AI&#xff1f; 交互型 AI 指的是具备多轮对话能力、状态记忆、工具调用…...

关于uint8_t、uint16_t、uint32_t、uint64_t的区别与分析

一、类型定义与字节大小 uint8_t、uint16_t、uint32_t、uint64_t 是 C/C 中定义的无符号整数类型&#xff0c;通过 typedef 对基础类型起别名实现。位宽&#xff08;bit&#xff09;和字节数严格固定&#xff1a; uint8_t&#xff1a;8 位&#xff0c;占用 ​1 字节&#xff…...

19685 握手问题

19685 握手问题 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;2024、省赛、数学 &#x1f4d6; &#x1f4da; package test ;import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);…...

react redux的学习,单个reducer

redux系列文章目录 一 什么redux&#xff1f; redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。集中式管理react应用中多个组件共享的状 简单来说&#xff0c;就是存储页面的状态值的一个库&#xf…...

CCF GESP C++编程 二级认证真题 2025年3月

C 二级 2025 年 03 月 CCF GESP C编程 二级认证真题 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C A A D A D A C B C D B C C 1 单选题 第 1 题 2025年春节有两件轰动全球的事件&#xff0c;一个是DeepSeek横空出世&#xff0c;另一个是贺岁片《哪吒2》票房惊人&#…...

Lua函数与表+Lua子文件加载与元表

Lua函数相关示例代码 --脚本型语言&#xff0c;不能先调用&#xff0c;再定义&#xff0c;因为代码是从上往下执行的 --第一种声明函数 function func1()print("这是func1") end--先定义&#xff0c;再调用&#xff0c;没有问题 func1() -------------------------…...

Linux systemd 服务全面详解

一、systemd 是什么&#xff1f; systemd 是 Linux 系统的现代初始化系统&#xff08;init&#xff09;和服务管理器&#xff0c;替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”&#xff0c;还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…...

Linux系统调用编程

目录 1.Linux下进程和线程进程线程区别查看进程pid终止进程pid 2.Linux虚拟内存管理与stm32内存映射设计目标与架构差异地址空间管理机制对比内存使用与性能特性 3.Linux系统调用函数fork()wait()exec() 4.树莓派环境下练习创建账号1创建用户账号2.配置用户权限3.查看用户 登录…...

AWS Langfuse AI用Bedrock模型使用完全教程

AWS Langfuse AI使用完全教程 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 AWS Langfuse AI使用完全教程Langfuse是什么?准备工作创建Langfuse账户1.创建LLM应用程序启用Bedrock…...

【Docker项目实战】使用Docker部署MediaCMS内容管理系统

【Docker项目实战】使用Docker部署MediaCMS内容管理系统 前言一、MediaCMS介绍1.1 MediaCMS 简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载Med…...

OpenHarmony子系统开发 - DFX(一)

OpenHarmony子系统开发 - DFX&#xff08;一&#xff09; 一、DFX概述 简介 在OpenHarmony中&#xff0c;DFX(Design for X)是为了提升质量属性的软件设计&#xff0c;目前包含的内容主要有&#xff1a;DFR&#xff08;Design for Reliability&#xff0c;可靠性&#xff09…...

深入解析:使用Python爬取Bilibili视频

深入解析&#xff1a;使用Python爬取Bilibili视频 引言 Bilibili&#xff0c;作为中国领先的年轻人文化社区&#xff0c;拥有海量的视频资源。对于想要下载Bilibili视频的用户来说&#xff0c;手动下载不仅费时费力&#xff0c;而且效率低下。本文将介绍如何使用Python编写一…...

详解数据结构线性表 c++实现

线性表 线性表是一种非常基础且重要的数据结构&#xff0c;它是具有相同数据类型的 n&#xff08;n≥0&#xff09;个数据元素的有限序列。这里的 “有限” 意味着元素的数量是确定的&#xff0c;“序列” 则表示元素之间存在着顺序关系。 顺序表 顺序表是线性表的一种顺序存…...

Prolog语言的网络协议栈

Prolog语言的网络协议栈 引言 网络协议栈是现代计算机网络的重要组成部分&#xff0c;它负责在网络中的各个节点之间以标准化的方式传输数据。在这一体系中&#xff0c;不同层次的协议相互协作&#xff0c;以实现从物理传输到应用层数据处理的功能。Prolog是一种以符号逻辑为…...

音视频基础(音频常用概念)

文章目录 **1. 比特率&#xff08;Bitrate&#xff09;****概念****影响****音频比特率****视频比特率** **2. 码率&#xff08;Bitrate&#xff09;****3. 帧&#xff08;Frame&#xff09;****概念****视频帧****音频帧** **4. 帧长&#xff08;Frame Length&#xff09;****…...

洛谷题单3-P5725 【深基4.习8】求三角形-python-流程图重构

题目描述 模仿例题&#xff0c;打印出不同方向的正方形&#xff0c;然后打印三角形矩阵。中间有个空行。 输入格式 输入矩阵的规模&#xff0c;不超过 9 9 9。 输出格式 输出矩形和正方形 输入输出样例 输入 4输出 01020304 05060708 09101112 13141516010203040506 …...

【数据结构】邻接表 vs 邻接矩阵:5大核心优势解析与稀疏图存储优化指南

邻接表法 导读一、邻接矩阵的不足邻接表二、存储结构三、算法评价3.1 时间复杂度3.2 空间复杂度 四、邻接表特点4.1 特点解读特点3特点4特点5 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 图作为一种复杂的数据结构&#xff0c;其…...

编程能力的跃迁时刻:技术革命与认知重构的交响曲

在软件开发领域,从业者常将"一万小时定律"视为能力增长的圭臬,但真正的能力跃迁往往发生在特定技术范式转换的临界点。当开发者首次理解递归算法的本质,当面向对象编程替代过程式思维,当自动化工具链重塑开发流程,这些认知地震时刻往往成为技术生涯的分水岭。 …...

PostIn V1.0.8版本发布,IDEA 插件支持一键扫描上报,让接口定义不再繁琐

PostIn是一款国产开源免费的接口管理工具&#xff0c;包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块&#xff0c;支持常见的HTTP协议、websocket协议等&#xff0c;支持免登陆本地接口调试&#xff0c;同时可以对项目进行灵活的成员权限、消息通知管理等。本周Pos…...

删除Linux服务器上多余的系统启动项,并重装Ubuntu系统

问题描述 2024年6月&#xff0c;Centos团队终止维护Centos7系统&#xff0c;Ubuntu成了我的替换方案。正好有一台闲置的服务器&#xff0c;于是我临危受命给这台服务器重装系统。 经过我一番研究&#xff0c;Ubuntu系统初步安装成功了&#xff0c;但是存在一大堆问题&#xff…...

在亚马逊云科技上使用n8n快速构建个人AI NEWS助理

前言&#xff1a; N8n 是一个强大的工作流自动化工具&#xff0c;它允许您连接不同的应用程序、服务和系统&#xff0c;以创建自动化工作流程&#xff0c;并且采用了开源MIT协议&#xff0c;可以放心使用&#xff0c;他的官方网站也提供了很多的工作流&#xff0c;大家有兴趣的…...

JSON介绍及使用

1.JSON 1.JSON简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据序列化协议&#xff0c;基于文本&#xff0c;完全独立于语言。 JSON由键值对组成&#xff0c;支持以下几种数据类型&#xff1a; 字符串&#xff1a;用双引号括起来的文本。 数…...

AOP 的织入过程是怎样的?

AOP&#xff08;面向切面编程&#xff09;的织入&#xff08;Weaving&#xff09;是将切面&#xff08;Aspect&#xff09;应用到目标对象&#xff08;Target Object&#xff09;并创建代理对象&#xff08;Proxy Object&#xff09;的过程。这个过程可以发生在不同的阶段&…...

链路聚合配置命令

技术信息 加入捆绑组&#xff0c;加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1&#xff0c;不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…...

为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?

在机器学习和深度学习中&#xff0c;数据集的划分方式取决于任务需求、数据量以及模型开发流程的严谨性。 1. 三者划分&#xff1a;训练集、验证集、测试集 目的 训练集&#xff08;Training Set&#xff09;&#xff1a;用于模型参数的直接训练。验证集&#xff08;Validati…...