【C语言回顾】联合和枚举

news2025/1/13 6:02:38

  • 前言
  • 1. 联合体
    • 1.1 联合体的声明
    • 1.2 联合体的特点
    • 1.3 联合体的使用
  • 2. 枚举
    • 2.1 枚举的声明
    • 2.2 枚举的特点
    • 2.3 枚举的使用
  • 结语

在这里插入图片描述
在这里插入图片描述

#include<GUIQU.h>
int main
{
上期回顾: 【C语言回顾】结构体
个人主页:C_GUIQU
专栏:【C语言学习】
return 一键三连;
}

在这里插入图片描述

前言

各位小伙伴大家好!上期小编给大家讲解了C语言中的结构体,接下来我们讲解一下联合和枚举!

1. 联合体

1.1 联合体的声明

在C语言中,联合体(Union)是一种特殊的数据类型,它允许在相同的内存位置存储不同类型的数据。联合体中的每个成员都有自己的类型和大小,但是联合体的内存大小等于其最大成员的大小。

联合体的声明通常包括以下几个部分:

  1. 关键字 union:表示声明的是一个联合体。
  2. 联合体名:一个合法的标识符,用于命名这个联合体。
  3. 成员列表:由多个成员组成,每个成员都有自己的类型和名称。
    联合体的声明示例如下:
union Data {
    int intValue;  // 整型成员
    float floatValue;  // 浮点型成员
    char stringValue[20];  // 字符数组成员
};

在这个例子中,我们声明了一个名为 Data 的联合体,它包含三个成员:一个整型成员 intValue、一个浮点型成员 floatValue 和一个字符数组成员 stringValue。联合体的内存大小至少与 stringValue 成员的大小相同,因为 stringValue 是最大的成员。
联合体的使用方式通常是这样的:

union Data data;
data.intValue = 10; // 设置整型成员的值
printf("整型成员的值:%d\n", data.intValue);
data.floatValue = 3.14; // 设置浮点型成员的值
printf("浮点型成员的值:%f\n", data.floatValue);
data.stringValue[0] = 'A'; // 设置字符数组成员的值
printf("字符数组成员的值:%c\n", data.stringValue[0]);

请注意,当访问联合体中的不同成员时,需要使用不同的访问方法,因为每个成员在内存中的位置是不同的。此外,由于联合体的内存大小是最大的成员的大小,所以在使用联合体时需要注意内存的有效管理。

1.2 联合体的特点

  1. 内存共享:联合体的所有成员共享同一块内存空间,这意味着同一时间只能存储一个成员的数据。当一个成员被修改时,其他成员的数据也会被修改。
  2. 最小大小:联合体的内存大小等于其所有成员中最大成员的大小。这意味着即使联合体中只有一个小成员,整个联合体的大小也会是该成员的大小。
  3. 成员访问:联合体中的成员可以通过点操作符(.)来访问。例如,如果联合体名为 unionType,成员名为 memberName,则可以通过 unionType.memberName 来访问该成员。
  4. 类型限制:每个成员必须有相同的访问权限(public或private),因为它们共享同一块内存空间。
  5. 类型转换:由于联合体的成员类型可以不同,因此在访问联合体成员时,需要进行类型转换。例如,如果一个联合体包含一个整型和一个浮点型成员,当访问浮点型成员时,需要将整型成员转换为浮点型。
  6. 编译器处理:编译器会为联合体的每个成员分配内存,并且当成员被访问时,编译器会自动处理内存的读取和写入操作。
  7. 限制使用:由于联合体的特殊性质,它并不适合所有的数据存储需求。在某些情况下,使用结构体(Structure)可能更加合适,因为结构体允许同时存储不同类型的数据,并且每个成员都有独立的内存空间。

1.3 联合体的使用

联合体(Union)在C语言中用于在同一内存位置存储不同类型的数据。它特别适用于需要灵活地使用不同数据类型的场合,或者当内存空间非常宝贵时。以下是联合体的几种典型使用场景:

  1. 数据交换:当两个不同的程序或模块需要交换数据,而数据类型又不完全匹配时,可以使用联合体来存储一个混合的数据类型,然后将这个联合体传递给需要处理数据的程序或模块。
  2. 存储多种类型的信息:在某些情况下,需要同时存储多种类型的信息,例如,一个结构体可能包含一个整数和一个浮点数,但是有时只需要存储整数,有时只需要存储浮点数。这时可以使用联合体来节省内存。
  3. 动态类型:在某些编程模型中,可能需要根据运行时的条件来决定存储什么类型的数据。联合体可以提供这样的灵活性,因为它的成员类型可以不同。
  4. 网络通信:在网络编程中,经常需要处理不同类型的数据,如整数、字符串、浮点数等。使用联合体可以方便地打包和解析这些数据。
  5. 游戏开发:在游戏开发中,可能会遇到需要存储多种状态的情况,如玩家的位置、速度、状态等。使用联合体可以更有效地管理这些状态信息。

在使用联合体时,需要注意以下几点:

  • 访问成员时要小心,因为一旦一个成员被访问,其他成员的数据可能会被破坏。
  • 不要在联合体中存储非常大或非常小的数据类型,因为这可能会导致内存碎片化。
  • 确保联合体的成员类型兼容,以便在访问成员时不需要进行复杂的类型转换。

下面是一个简单的例子,展示了如何在C语言中使用联合体:

#include <stdio.h>
union Data {
    int intValue;
    float floatValue;
};
int main() 
{
    union Data data;
    data.intValue = 10;
    printf("整型值:%d\n", data.intValue);
    data.floatValue = 3.14;
    printf("浮点型值:%f\n", data.floatValue);
    return 0;
}

在这个例子中,我们定义了一个名为 Data 的联合体,它包含一个整型成员 intValue 和一个浮点型成员 floatValue。在 main 函数中,我们创建了一个 Data 类型的变量 data,并分别设置它的整型和浮点型成员的值。

2. 枚举

2.1 枚举的声明

在C语言中,枚举(Enum)是一种特殊的数据类型,用于定义一组命名的常量。枚举类型可以用于定义一组相关的常量,这些常量通常用于表示不同的状态、选项或枚举值。枚举声明通常包括以下几个部分:

  1. 关键字 enum:表示声明的是一个枚举类型。
  2. 枚举名:一个合法的标识符,用于命名这个枚举类型。
  3. 枚举值列表:由多个枚举值组成,每个枚举值后面可以跟随一个数字(可选),表示该枚举值在枚举中的值。

枚举的声明示例如下:

enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
};

在这个例子中,我们声明了一个名为 Day 的枚举类型,它包含了一周中的七天。每个枚举值后面都没有跟随数字,因此它们的值会从0开始自动递增。第一个枚举值 SUNDAY 的值为0,第二个枚举值 MONDAY 的值为1,依此类推。

枚举的使用方式通常是这样的:

enum Day today;
today = FRIDAY;
printf("今天是:%d(%s)\n", today, enum_Day_string(today));

在这个例子中,我们声明了一个名为 today 的枚举变量,并将其赋值为 FRIDAY。然后,我们使用一个自定义的函数 enum_Day_string 来将枚举值转换为对应的枚举名称。

请注意,枚举值默认从0开始,如果需要从其他值开始,可以在枚举值后面添加一个数字。例如:

enum Day {
    SUNDAY = 7,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
};

在这个例子中,SUNDAY 的值被显式设置为7,而其他枚举值的值会从8开始递增。

2.2 枚举的特点

  1. 命名的常量:枚举提供了一种方便的方式来定义一组相关的常量,这些常量可以被赋予有意义的名称,使得代码更加可读和易于维护。
  2. 值的范围:枚举值通常是整数,并且它们可以具有预定义的范围。枚举值可以是从0开始的整数,也可以从某个特定的值开始。
  3. 类型安全:枚举值在编译时被确定,因此在运行时不会出现类型不匹配的问题。这有助于提高代码的健壮性。
  4. 数据类型:枚举类型在编译时会被转换为整数类型。默认情况下,枚举值会从0开始递增,但也可以从其他值开始。
  5. 默认值:如果枚举值没有显式指定初始值,编译器会自动为每个枚举值分配一个从0开始的整数值。
  6. 枚举的枚举:虽然这不是枚举的主要用途,但是可以定义一个枚举来表示另一个枚举的值,这被称为枚举的枚举。
  7. 枚举的比较:枚举值可以进行比较操作,因为它们都是整数。这使得枚举可以用于表示状态或选项,并且可以方便地进行逻辑判断。
  8. 枚举的数组:枚举值可以作为数组的索引,因为它们都是整数。这使得枚举可以用于表示选项集合,并且可以方便地进行循环遍历。
  9. 枚举的指针:虽然不常见,但枚举值可以作为指针,指向一个包含枚举值的数组。
  10. 枚举的函数参数:枚举值可以作为函数的参数,这使得枚举可以用于表示状态或选项,并且可以方便地进行状态切换。

2.3 枚举的使用

在C语言中,枚举(Enum)主要用于定义一组相关的常量,这些常量通常用于表示不同的状态、选项或枚举值。枚举的使用方式如下:

  1. 声明枚举:首先,使用 enum 关键字声明一个枚举类型,后面跟着枚举名和枚举值列表。
enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
};
  1. 定义枚举变量:使用枚举类型声明一个变量,并可以为该变量赋值。
enum Day today;
today = FRIDAY;
  1. 枚举值的访问:通过点操作符(.)访问枚举变量的值。
printf("今天是:%d(%s)\n", today, enum_Day_string(today));
  1. 枚举值的比较:枚举值可以进行比较操作,因为它们都是整数。
if (today == FRIDAY) {
    printf("今天是星期五\n");
}
  1. 枚举值的数组:枚举值可以作为数组的索引,因为它们都是整数。
enum Day days[] = {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
for (int i = 0; i < 7; i++) {
    printf("星期%d是%s\n", i + 1, enum_Day_string(days[i]));
}
  1. 枚举值的指针:虽然不常见,但枚举值可以作为指针,指向一个包含枚举值的数组。
enum Day *days_ptr = days;
for (int i = 0; i < 7; i++) {
    printf("星期%d是%s\n", i + 1, enum_Day_string(*(days_ptr + i)));
}
  1. 枚举值的函数参数:枚举值可以作为函数的参数,这使得枚举可以用于表示状态或选项,并且可以方便地进行状态切换。
void printDay(enum Day day) {
    switch (day) {
        case SUNDAY:
            printf("今天是星期日\n");
            break;
        case MONDAY:
            printf("今天是星期一\n");
            break;
        // 其他星期...
        default:
            printf("输入的星期值无效\n");
            break;
    }
}
printDay(SUNDAY); // 调用函数,打印今天是星期日

请注意,枚举值在编译时会被转换为整数类型,因此在访问枚举值时需要进行适当的转换。此外,枚举值默认从0开始,如果需要从其他值开始,可以在枚举值后面添加一个数字。

结语

以上就是小编对联合和枚举的详细讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

大数据技术原理(二):搭建hadoop伪分布式集群这一篇就够了

&#xff08;实验一 搭建hadoop伪分布式&#xff09; -------------------------------------------------------------------------------------------------------------------------------- 一、实验目的 1.理解Hadoop伪分布式的安装过程 实验内容涉及Hadoop平台的搭建和…

有史以来最大的苹果手机?iPhone 16屏幕模组大升级

随着科技的不断进步&#xff0c;用户对于手机屏幕的需求也在不断提高。从最初的触控体验到如今的高分辨率、高刷新率&#xff0c;屏幕技术的发展日新月异。而据最新的消息显示&#xff0c;即将到来的iPhone 16系列将在屏幕模组上进行一次重大升级&#xff0c;有望成为有史以来最…

建模:Maya

一、常用按键 1、alt 左键 —— 环绕查看 2、alt 中键 —— 拖动模型所在面板 3、空格 —— 进入三视图模式&#xff1b;空格 左键按住拖动 —— 切换到对应视图 二、骨骼归零 1、T Pose 旋转模式&#xff0c;点击模型&#xff0c;摆好T姿势即可 2、复制模型设置200距离…

c++ queue容器

在C标准库中&#xff0c;std::queue 是一个容器适配器&#xff0c;它提供了队列&#xff08;FIFO - First In First Out&#xff09;的数据结构。队列是一种特殊的线性数据结构&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端…

做抖音小店找带货达人合作为什么不成功呢?

大家好&#xff0c;我是喷火龙。 做抖音小店&#xff0c;和带货达人合作的模式&#xff0c;流量是最稳定的&#xff0c;爆单几率也是最大的&#xff0c;也是最适合新手商家的&#xff0c;想和带货达人合作&#xff0c;那肯定是得让达人带你的产品的。 但有些朋友把样品寄给达…

【Linux】-Linux文件的上传和下载、压缩和解压[9]

目录 前言 一、上传和下载 1、使用finalshell对Linux系统进行上传下载 2、rz、sz命令 二、解压和压缩 1、压缩格式 2、tar命令压缩 3、tar命令压缩 4、zip命令压缩文件 5、unzip命令解压文件 前言 在Linux系统中&#xff0c;文件的上传和下载、压缩和解压是非常重要…

面向浏览器端免费开源的三维可视化编辑器,包含BIM轻量化,CAD解析预览等特色功能。

ES 3DEditor &#x1f30d;Github地址 https://github.com/mlt131220/ES-3DEditor &#x1f30d;在线体验 https://editor.mhbdng.cn/#/ 基于vue3与ThreeJs&#xff0c;具体查看Doc 主要功能&#xff1a; 模型导入展示&#xff0c;支持OBJ、FBX、GLTF、GLB、RVT、IFC、SEA、3…

FedSyn: Synthetic Data Generation using Federated Learning

arxiv2022,没找到是哪个刊物的,是没投中吗? 这篇是用GAN做数据生成,每个client都训练一个生成器,加噪声传到server端聚合,实验是衡量生成图片的质量。 论文地址:arxiv code:没找到 贡献 提出了提出了一种新颖的方法(FedSyn ),将联邦学习、使用 GAN的合成数据生成…

使用 ASM 修改字段类型,解决闪退问题

问题 我的问题是什么&#xff1f; 在桥接类 UnityBridgeActivity 中处理不同 unity 版本调用 mUnityPlayer.destroy(); 闪退问题。 闪退日志如&#xff1a; 闪退日志说在 UnityBridgeActivity中找不到类型为 UnityPlayer 的属性 mUnityPlayer。 我们知道&#xff0c;Android…

深度学习之Pytorch框架垃圾分类智能识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加快和人们环保意识的提高&#xff0c;垃圾分类已成为城市管理的重要一环。然而&am…

【Linux学习】进程

下面是有关进程的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. 进程的概念 1.1 进程与程序 1.2 进程号 2. 进程的状态 2.1 fork创建子进程 2.2 父子进程间的文件共享 3. 进程的诞生与终止 3.1 进程的诞生 3.2 进程的终止 1. 进…

[4]CUDA中的向量计算与并行通信模式

CUDA中的向量计算与并行通信模式 本节开始&#xff0c;我们将利用GPU的并行能力&#xff0c;对其执行向量和数组操作讨论每个通信模式&#xff0c;将帮助你识别通信模式相关的应用程序&#xff0c;以及如何编写代码 1.两个向量加法程序 先写一个通过cpu实现向量加法的程序如…

算法刷题day52:区间DP

目录 引言一、石子合并二、环形石子合并三、能量项链四、加分二叉树 引言 关于区间DP&#xff0c;我其实觉得核心思想就是把一个区间拆分为任意两个区间&#xff0c;相当于是模拟枚举全部这种区间组合的过程&#xff0c;然后从中寻求最优解&#xff0c;本质上的思想不难&#…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域&#xff0c;PLC工程师扮演着至关重要的角色&#xff0c;他们负责构建、维护自动化系统&#xff0c;推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段&#xff0c;每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

必应bing国内推广开户,全方位必应广告开户流程介绍!

在所有获客渠道中&#xff0c;搜索引擎广告成为企业扩大品牌影响力、精准触达目标客户的关键途径之一。作为全球领先的搜索引擎之一&#xff0c;必应&#xff08;Bing&#xff09;拥有庞大的用户群体和独特的市场优势&#xff0c;是企业不可忽视的营销阵地。云衔科技&#xff0…

声音转文本(免费工具)

声音转文本&#xff1a;解锁语音技术的无限可能 在当今这个数字化时代&#xff0c;信息的传递方式正以前所未有的速度进化。从手动输入到触控操作&#xff0c;再到如今的语音交互&#xff0c;技术的发展让沟通变得更加自然与高效。声音转文本&#xff08;Speech-to-Text, STT&…

微服务:利用RestTemplate实现远程调用

打算系统学习一下微服务知识&#xff0c;从今天开始记录。 远程调用 调用order接口&#xff0c;查询。 由于实现还未封装用户信息&#xff0c;所以为null。 下面我们来使用远程调用用户服务的接口&#xff0c;然后封装一下用户信息返回即可。 流程图 配置类中注入RestTe…

SAP销售手工发票录入

销售手工发票录入用于处理未启用 SD 模块标准处理流程的零星销售业务。 科目设置 收入类科目&#xff1a;设置税务类型&#xff0c;允许含税/不含税过账应收账款: 留空。其他应收款的设置类似 编辑选项设置 在中国&#xff0c;编辑选项一般设置为基于总额计税。使用事务码 FB…

Jenkins 构建 Web 项目:项目和服务器在一起的情况

构建的命令 node -v pnpm -v pnpm install pnpm build # 将dist打包成dist.zip zip -r dist.zip dist mv dist.zip /www/wwwroot/video.xxx.com/dist.zip cd /www/wwwroot/video.xxx.com # 解压并覆盖之前的文件 unzip -o dist.zip

期货学习笔记-横盘行情学习1

横盘行情的特征及分类 横盘行情的概念 横盘行情时中继形态的一种&#xff0c;一般常出现在大涨或大跌之后出现横盘行情是对当前趋势行情的修正&#xff0c;是对市场零散筹码的清理&#xff0c;是为了集中筹码更便于后期行情的展开 横盘行情的特征 1.水平运动&#xff1a;该…