【C语言基础】枚举和联合体

2023-09-18 21:48:38

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处


前言

多个常量具有强相关性的时候,例如性别有男女之分;一周七天;一年12个月等,最好使用枚举来替代宏定义,即用一个变量名来包含所有的这些强相关性的常量,当要用的时候,取出其一即可。

#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

一、枚举

1.1 枚举的含义

枚举的含义:当一个变量有多种可能的数值时,适合使用枚举(Enumeration)来表示这个变量。其中的数值被称呼为枚举常量或是枚举成员。

1.2 枚举的语法

枚举语法:在C语言中,默认第一个枚举成员的值为int型零,后续枚举成员的值在前一个成员上加1,因此枚举成员都无需定义类型。

enum enum_name {
    member1,
    member2,
};

其中,enum_name 是枚举类型的名称,member1member2等是枚举成员的名称。
在这里插入图片描述
在这里插入图片描述
下面是一个示例:

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

但也可以显式地为枚举成员指定具体的整数值,例如:

enum Color {
    RED = 10,
    GREEN = 20,
    BLUE = 30
};

1.3 访问枚举成员

可以使用枚举类型名称和成员名称来访问枚举中的元素。假设有一个名为Weekday的枚举类型,包含了一周中的每个工作日,可以通过以下方式访问枚举中的元素:

enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY
};

enum Weekday today = MONDAY; // 声明并初始化变量

if (today == TUESDAY) {
    printf("今天是周二\n");
} else if (today == FRIDAY) {
    printf("今天是周五\n");
}

在这个示例中,我们声明了一个名为 today 的变量,并将其初始化为 MONDAY 枚举成员。然后,我们使用 if 语句判断 today 变量的值是否等于 TUESDAYFRIDAY 枚举成员,并打印对应的语句。

1.4 宏定义和枚举的区别

(1)枚举是将多个有关联的符号封装在一个枚举中,而宏定义是完全散的。也就是说枚举其实是多选一。
(2)什么情况下用枚举?当我们要定义的常量是一个有限集合时(譬如一星期有7天,譬如一个月有31天,譬如一年有12个月····),最适合用枚举。(其实宏定义也行,但是枚举更好)
(3)不能用枚举的情况下(定义的常量符号之间无关联,或者无限的)用宏定义。
总结:宏定义先出现,用来解决符号常量的问题;后来人们发现有时候定义的符号常量彼此之间有关联(多选一的关系),用宏定义来做虽然可以但是不贴切,于是乎发明了枚举来解决这种情况。

二、共用体

2.1 访问共用体中的元素

共用体又称为联合体
要访问共用体(union)中的元素,可以使用点运算符 (.) 或箭头运算符 (->),具体取决于共用体的使用方式。
如果共用体是一个变量,则可以使用点运算符来访问其成员。假设有以下共用体定义:

  union MyUnion {
        int i;
        float f;
    };
可以通过创建共用体变量并使用点运算符来访问其成员:
 union MyUnion u;
    u.i = 10;
    printf("%d\n", u.i);   // 输出: 10
    u.f = 3.14;
    printf("%f\n", u.f);   // 输出: 3.140000

如果共用体是一个指针,则需要使用箭头运算符来访问其成员。假设有以下共用体定义:

union MyUnion {
    int i;
    float f;
};
struct MyStruct {
    union MyUnion* u;
};

可以通过创建共用体指针,并使用箭头运算符来访问其成员:

union MyUnion u;
u.i = 10;
struct MyStruct s;
s.u = &u;
printf("%d\n", s.u->i);   // 输出: 10
u.f = 3.14;
printf("%f\n", s.u->f);   // 输出: 3.140000

需要注意的是,由于共用体中的成员共享存储空间,因此在访问共用体的不同成员之前应确保已正确设置了所需的成员类型。否则,可能导致数据类型的解释错误或访问越界的问题。

2.2 联合体指针

联合体指针是指指向联合体类型的指针。联合体(Union)是一种特殊的数据类型,它可以在同一内存空间中存储不同类型的成员变量,但同时只能存储其中的一种类型。
定义一个联合体类型如下:

union MyUnion {
    int num;
    char ch;
    float f;
};

通过使用联合体指针,我们可以操作联合体的成员变量。例如,假设有一个联合体变量 myUnion

union MyUnion myUnion;

我们可以定义一个联合体指针并将其指向这个联合体变量:

 union MyUnion *ptr = &myUnion;

通过指针访问联合体的成员变量,可以使用箭头运算符(->)或间接访问运算符(*)加括号。例如,访问联合体中的整型成员变量:

(*ptr).num = 42;
// 或者使用箭头运算符
ptr->num = 42;

类似地,我们可以通过联合体指针操作其他类型的成员变量。
需要注意的是,使用联合体指针时需要确保指针指向的是有效的联合体对象,否则可能导致未定义的行为和错误结果。

在这里插入图片描述

更多推荐

车辆检测:An Efficient Wide-Range Pseudo-3D Vehicle Detection Using A Single Camera

论文作者:ZhupengYe,YinqiLi,ZejianYuan作者单位:Xi'anJiaotongUniversity论文链接:http://arxiv.org/abs/2309.08369v1项目链接:https://www.youtube.com/watch?v=1gk1PmsQ5Q8内容简介:1)方向:车辆检

高并发场景下的接口调用优化

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

网络安全(黑客)自学笔记

前言作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。计算机各领域的知识水平决定你渗透水平的上限。【1】比如:你编程水平高,那你在代码审计的时候就会比别人强,写出的漏洞利用工具就会比别人的好用;【2】比如:你数据库知识水平高,那你在进行SQL注入攻击的时候,你就可以写出更多更好的SQL注入语句

数据字段保证唯一性

数据字段保证唯一性我们日常开发中,常见这么一个需求,要求一个code,一个name,需要保证code不重复,而code是用户输入的,常见的就比如一些字典等。这个的我们常见的几种做法的话。唯一键要么就是直接以code作为主键,这样的话,伪代码基本就是@Transactional(rollbackFor=Exception

在 Substance Painter中自定义Shader

为什么要学习在SubstancePainter中自定义Shader?答:需要实现引擎与SubstancePainter中的渲染效果一致,材质的配置也一致,所见即所得。基础概述首先在着色器设置这里,我们可以查看当前渲染使用的着色器如果没有着色器设置窗口,可以在窗口这里打开点击着色器名称,可以切换当前拥有的shader相应

沉降安全监测之静力水准仪安装与精度分析

静力水准仪的安装使用步骤如下:1、选择合适的安装位置:静力水准仪应该安装在平稳且不易受到外力影响的地面上,以确保测量结果的准确性。同时,应避免安装在有风的地方,因为风会影响水准仪的读数。2、安装支架:静力水准仪需要安装在支架上才能使用。支架应该牢固可靠,能够承受水平方向上的荷载。支架的高度应该与被测物体的高度相匹配,以

【2023研电赛】华东赛区一等奖:基于EtherCAT通信有限时间位置收敛伺服系统

本文为2023年第十八届中国研究生电子设计竞赛作品分享,参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力,更有丰富电子礼品等你来领!,分享2023研电赛作品扩大影响力,更有丰富电子礼品等你来领!基于EtherCAT通信有限时间位置收敛伺服系统参赛单位:浙江工业大学指导老师:陈强吴春参赛队员:沙为民吴辰浩申屠方

ActiveMQ面试题(二)

文章目录前言一、死信队列二、ActiveMQ中的消息重发时间间隔和重发次数吗?总结前言死信队列ActiveMQ中的消息重发时间间隔和重发次数吗?一、死信队列如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试,可以关闭AUTO_ACKNOWLEDGE,将ack交由程序自己处理。那如果使用了AUTO_AC

【2023华为杯A题】WLAN网络信道接入机制建模(代码、思路.....)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1背景1.1分布式信道接入和二进制指数退避1.2基于Markovchain的DCF机制建模和系统性能分析📚2WLAN组

P1827 [USACO3.4] 美国血统 American Heritage(前序 + 中序 生成后序)

P1827[USACO3.4]美国血统AmericanHeritage(前序+中序生成后序)一、前言二叉树入门题。涉及到树的基本知识、树的结构、树的生成。本文从会从结构,到完成到,优化。二、基础知识Ⅰ、二叉树的遍历前序遍历:根左右中序遍历:左根右后序遍历:左右根通过上面的观察,可得根在那,就是什么方式的遍历Ⅱ、二叉树的

Kotlin Coroutines包下的select函数简介

在工作中,发现了kotlinCoroutines包下有大量功能非常强大的API,这篇文章中,我们主要来聊一聊select函数1.什么是select函数想象一下这个场景,在程序应用中,为了实现一个业务逻辑,你可能有好几种方式来实现,但是我只需要最快实现结果的一种方式,这时候我们就可以使用select函数了。如果还不是很清

热文推荐