枚举类型和联合体类型

简介: 枚举类型和联合体类型

一、 枚举类型

简单介绍一下

枚举 顾名思义 就是一一例举

像我们生活中的很多东西 比如说一周有多少天

性别有几种 这些都可以用枚举类型来一一列举


1. 枚举类型的定义

我们以性别为例子

这里如果我们开始打印它们的数值的话 我们会发现

typedef enum Sex
{
  MALE,
  FEMALE,
  SECRET
}Sex;

male的初始数值是0

后面的数值依次增加1

这里也从侧面证明了enum枚举类型枚举出来的是常量

当然我们对于enum的值也可以自己设置

例如


2. 枚举类型的优点

我们为什么要使用枚举类型?

增加代码的可读性和可维护性

就拿我们前面写的一篇博客 通讯录 来说


case 1 2 3 这些可读性并不高 我怎么会知道1 2 3这些是什么意思呢?

这个时候我们就可以使用我们的枚举类型来定义

例如

enum select
{
  exit,
  add,
  del,
  search,
  rev,
  show,
};

使用这样的枚举类型就可以很好的替代

使用方便

这个就不用过多解释了 因为它可以一次定义多个常量

3. 枚举的使用

看代码

int main()
{
  enum Color//颜色
  {
    RED = 1,
    GREEN = 2,
    BLUE = 4
  };
  enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
  return 0;
}

二. 联合体(共用体)

1. 联合体的定义

联合体是一种特殊的自定义类型

这种类型定义的变量包含一系列的成员 特征是这些成员公用一块空间

例如

union UN
{
  char c;
  int i;
};

我们来看看 这个联合体的大小是多少.


是4

这是为什么呢?

因为一个int类型的大小就已经是4了啊

那么char类型的数据放在哪里呢?

我们来看定义

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

这时候char类型的最大对齐数是1

b类型的最大对齐数是4

所以说它的大小是4

2. 联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大(因为联合至少得有能力保存最大的那个成员)。

不知道同学们还记不记得我们前面设计了一个算法来计算计算机的大小端存储

其实这个判断方法我们利用union来判断也可以

//判断当前计算机的大小端存储
int main()
{
  int a = 1;
  //0x 00 00 00 01;
  //01 00 00 00 ---小端存储
  //00 00 00 01 ---大端存储
  if (*(char*)&a == 1)
  {
    printf("小端存储\n");
  }else
    printf("大端存储\n");
 
  return 0;
}

用联合体

int check_sys(int i)
{
  union
  {
    char a;
    int i;
  }un;
  un.i = 1;
  return un.a;
}
int main()
{
  int a = 1;
  int ret = check_sys(a);
  if (ret == 1)
  {
    printf("小端\n");
  }else
    printf("大端\n");
 
  return 0;
}

实现结果如下


这样我们就知道了我们现在使用的机器是使用的小端法啦

3. 联合体的计算

首先上定义

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

看代码:

union UN
{
  char c[5];
  int n;
};
 
union UN2
{
  short a[7];// 2 8   14    2
  int i;//4 8               4 
};
int main()
{
  union UN un;
  printf("%d\n", sizeof(un));
  printf("%d\n", sizeof(union UN2));
  return 0;
}

运行结果如下:

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言

目录
相关文章
|
11月前
|
缓存 监控 测试技术
掌握容器化持续集成/持续部署(CI/CD)的最佳实践
【10月更文挑战第8天】本文介绍了容器化持续集成/持续部署(CI/CD)的最佳实践,涵盖容器化CI/CD的概念、优势和实施步骤。通过使用容器技术,可以实现环境一致性、快速迭代和易于扩展,提高软件开发的效率和可靠性。文章还详细讨论了编写高效的Dockerfile、自动化测试、安全性、监控和日志管理等方面的最佳实践。
|
关系型数据库 MySQL Java
MySQL的数据库访问接口
mysql-connectors Table of Contents 1. 数据库访问接口概述 2. MySQL 的数据库访问接口 1 数据库访问接口概述 大部分流行的关系数据库产品采用的都是 C/S 架构。因此,应用程序要访问数据库的数据就必须和各种数据库客户端(也称为数据库访问接口)打交道。可以这么认为,每一种流行的编程语言都需要一个对应的数据
8740 0
|
XML JSON JavaScript
🤓 Filter&Listener&Ajax(二)
🤓 Filter&Listener&Ajax
146 0
|
Python
Python:使用 os、shutil 模块对文件与目录操作
当你想批量处理文件的时候,使用 python 对文件或者文件夹进行操作,可以迅速地解决问题。 在 python 里面有几个内置模块可以对文件进行复制、移动、重命名及读写等操作。以下是对 os、shutil 模块里面的重要函数与方法进行的简单介绍。
190 0
|
存储 监控 关系型数据库
日志审计:开启RDS/PolarDB错误日志采集
本文主要介绍如何在日志审计中开启RDS错误日志以及Polardb错误日志的采集与监控
|
开发工具 vr&ar 图形学
|
6天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1146 3
|
5天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
748 11