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

devtools/2024/10/21 5:38:31/

  • 前言
  • 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.ppmy.cn/devtools/42461.html

相关文章

vue3 vant4实现抖音短视频功能

文章目录 1. 实现效果2. 精简版核心代码3. 完整功能点&#xff08;本文章不写&#xff0c;只写核心代码&#xff09; 1. 实现效果 2. 精简版核心代码 使用的 vue3 vant4组件使用van-swipe进行轮播图切换实现 <template><div :style"{width: width px,overflo…

二叉树求解大小操作详解

目录 一、求所有结点个数 1.1 递归思路 1.2 递归分支图 1.3 递归栈帧图 1.4 C语言实现 二、求叶子结点个数 2.1 递归思路 2.2 递归分支图 2.3 递归栈帧图 2.4 C语言实现 三、求第K层的结点个数 3.1 递归思路 3.2 递归分支图 3.3 递归栈帧图 3.4 C语言实现 四、求…

Java代码审计---SpEL表达式注入

简单了解 SpEL&#xff08;Spring Expression Language&#xff09; 是 Spring 中的表达式语言&#xff0c;用于在运行时评估和处理表达式。它提供了一种灵活的方式来访问和操作对象的属性、方法和其他表达式。SpEL可以用于配置文件、注解、XML 配置等多种场景&#xff0c;用于…

k8s遇到的错误记录

时隔四年有开始重新鼓捣k8s了&#xff0c;重新安装后遇到的错误记录如下&#xff1a; Error: Package: kubelet-1.14.0-0.x86_64 (kubernetes) Requires: kubernetes-cni 0.7.5 Available: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) …

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.1 CTPN&#xff08;2016&#xff09; 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network&#xff08;基于连接文本提议网络的自然图像文本…

pdfbox pdf转换图片时中文丢失,变成方框,提示No glyph for xxx in font STSong-Light

使用pdfbox转换图片时&#xff0c;转换出来的图片中文丢失&#xff0c;变成方框。原因是由于服务器字体缺失&#xff0c;pdfbox在转换时找不到合适的字体。 有几种方案&#xff1a; 服务器安装字体&#xff0c;具体资源百度使用备用字体。 将pdfbox中的FontMapperImpl类&…

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中&#xff0c;我们可以看到微服务列表&#xff0c;其中有一栏叫“健康实例数” &#xff08;如下图&#xff09;&#xff0c;表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 &#xff1f; 本章…

Java通用三级菜单工具类

Java通用三级菜单工具类 通常在写三级菜单时会使用递归方式去写&#xff0c;但是时间长了会发现很多重复的代码一直在写&#xff0c;改&#xff0c;也就改几个名字。 实现方式 抽象属性结构 常用的三个字段&#xff0c;子级id、父级id、其次是数组children。 将返回对象或…