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

  • 前言
  • 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.mzph.cn/diannao/13659.shtml

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

相关文章

Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现

Linux多线程系列三: 生产者消费者模型,信号量,基于阻塞队列和环形队列的这两种生产者消费者代码的实现 一.生产者消费者模型的理论1.现实生活中的生产者消费者模型2.多线程当中的生产者消费者模型3.理论 二.基于阻塞队列的生产者消费者模型的基础代码1.阻塞队列的介绍2.大致框架…

别说废话!说话说到点上,项目高效沟通的底层逻辑揭秘

假设你下周要在领导和同事面前汇报项目进度&#xff0c;你会怎么做&#xff1f;很多人可能会去网上搜一个项目介绍模板&#xff0c;然后按照模板来填充内容。最后&#xff0c;汇报幻灯片做了 80 页&#xff0c;自己觉得非常充实&#xff0c;但是却被领导痛批了一顿。 这样的境…

树的非递归遍历(层序)

层序是采用队列的方式来遍历的 就比如说上面这颗树 他层序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…

简析网络风险量化的价值与应用实践,如何构建网络风险预防架构

网络风险量化能够让公司董事会和高管层看清当前的网络安全风险格局&#xff1b;它还将使安全团队能够在业务需求的背景下做出网络安全决策&#xff0c;帮助组织确定哪些风险对业务构成最大的威胁&#xff0c;以及预期的经济损失将是什么。 随着网络攻击手段的日益多样化和复杂…

多模态大模型新进展——GPT-4o、Project Astra关键技术丨青源Workshop第27期

青源Workshop丨No.27 多模态大模型新进展—GPT-4o、Project Astra关键技术主题闭门研讨会 刚刚过去的两天&#xff0c;OpenAI、Google纷纷发布了多模态大模型的最新成果&#xff0c;GPT-4o、Project Astra先后亮相。 本周五&#xff08;北京时间5月17日&#xff09;18点&#x…

O2OA(翱途)开发平台数据统计如何配置?

O2OA提供的数据管理中心&#xff0c;可以让用户通过配置的形式完成对数据的汇总&#xff0c;统计和数据分组展现&#xff0c;查询和搜索数据形成列表数据展现。也支持用户配置独立的数据表来适应特殊的业务的数据存储需求。本文主要介绍如何在O2OA中开发和配置统计。 一、先决…

【30天精通Prometheus:一站式监控实战指南】第6天:mysqld_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

PersonalLLM——探索LLM是否能根据五大人格特质重新塑造一个新的角色?

1.概述 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如ChatGPT&#xff0c;致力于构建能够辅助人类的个性化人工智能代理&#xff0c;这些代理以进行类似人类的对话为重点。在学术领域&#xff0c;尤其是社会科学中&#xff0c;一些研究报告已经…

正心归一、绽放真我 好普集团正一生命文化艺术大赛(中老年赛区)正式启动

为进一步弘扬社会主义核心价值观&#xff0c;弘扬生命文化&#xff0c;提升公众对生命价值的认识与尊重&#xff0c;同时展现中老年艺术家的创作才华&#xff0c;激发广大中老年朋友的艺术热情和创造力。好普集团主办&#xff0c;幸福金龄会与正一生命科学研究&#xff08;广州…

AWS安全性身份和合规性之Artifact

AWS Artifact是对您很重要的与合规性相关的信息的首选中央资源。AWS Artifact是一项服务&#xff0c;提供了一系列用于安全合规的文档、报告和资源&#xff0c;以帮助用户满足其合规性和监管要求。它允许按需访问来自AWS和在AWS Marketplace上销售产品的ISV的安全性和合规性报告…

网络模型-VLAN聚合

VLAN聚合 VLAN聚合(VLAN Aggregation,也称SuperVLAN)指在一个物理网络内&#xff0c;用多个VLAN(称为Sub-VLAN)隔离广播域并将这些Sub-VLAN聚合成一个逻辑的VLAN(称为SuperVLAN)&#xff0c;这些Sub-VLAN使用同一个IP子网和缺省网关&#xff0c;&#xff0c;进而达到节约IP地址…

BOM..

区别&#xff1a;

基于BERT的医学影像报告语料库构建

大模型时代&#xff0c;任何行业&#xff0c;任何企业的数据治理未来将会以“语料库”的自动化构建为基石。因此这一系列精选的论文还是围绕在语料库的建设以及自动化的构建。 通读该系列的文章&#xff0c;犹如八仙过海&#xff0c;百花齐放。非结构的提取无外乎关注于非结构…

excel转pdf并且加水印,利用ByteArrayOutputStream内存流不产生中间文件

首先先引入包&#xff1a;加水印和excel转PDF的 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><dependency><groupId>org.apache.poi&l…

2024全新爆款好物推荐,618必买数码好物清单吐血整理!

​距离618购物狂欢节越来越近了&#xff0c;有很多日常价格不菲的产品在这次活动期间都会进行促销活动&#xff0c;尤其是数码类产品&#xff0c;加上618的优惠活动更有吸引力了。不过面对大促的热潮我们消费者在选购商品的同时还是要擦亮眼睛&#xff0c;避免买到质量不好的商…

SSE 与 SASE哪个云原生安全框架更加适合

近年来&#xff0c;随着云计算和网络技术的不断发展&#xff0c;出现了一种新的网络安全解决方案——SASE&#xff08;安全访问服务边缘&#xff09;。SASE是一种将网络和安全功能融合到单个基于云的服务中的框架&#xff0c;旨在提供更加安全、高效和便捷的网络访问体验。SASE…

我的前端封装之路

最近有粉丝提问了我一个面试中遇到的问题&#xff0c;他说面试的时候&#xff0c;面试官问我&#xff1a;你在以前的项目中封装过组件吗&#xff1f;或者做过npm公共库吗&#xff1f;遇到过什么问题吗&#xff1f;当时自己突然觉得好像没什么可回答的啊&#xff0c;但面试结束想…

前端 CSS 经典:弧形边框选项卡

1. 效果图 2. 开始 准备一个元素&#xff0c;将元素左上角&#xff0c;右上角设为圆角。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, i…

thingML的学习——什么是thingML

今天开始建模的学习&#xff0c;thingML是建模的一种工具 &#xff0c;也可以理解为一种建模语言&#xff0c;有自己的语法和语义。 ThingML 支持的多种平台和通信协议&#xff0c;如UART、I2C、MQTT、WebSocket、REST、ROS、Bluetooth、BLE和Zwave&#xff0c;通过插件机制&a…

Spring Cloud Alibaba-07-RocketMQ消息驱动

Lison <dreamlison163.com>, v1.0.0, 2024.4.20 Spring Cloud Alibaba-07-RocketMQ消息驱动 文章目录 Spring Cloud Alibaba-07-RocketMQ消息驱动MQ简介MQ的应用场景常见的MQ产品RocketeMQ的架构及概念 RocketMQ入门RocketMQ环境搭建 SpringBoot 集成 RocketMQ MQ简介 …