自定义类型(二)

简介: 自定义类型

2.枚举


顾名思义就是列举,将有可能的值一一列举出来

例如


月份有12个月可以一一列举
三原色也可以列举


2.1 枚举类型的定义


enum Day//星期
{
  Mon,
  Tues,
  Wed,
  Thur,
  Fri,
  Sat,
  Sun
};
enum Color//三原色
{
  Red,
  Green,
  Blue
};


以上定义的 enum Day和 enum Color都是枚举类型

{}中的内容是枚举类型的可能取值,也称作枚举常量

这些可能的取值都是有初值的,默认第一个枚举常量的值是从0开始,依次递增,也可以在定义枚举类型是赋予初值。


2.2 枚举的优点


1. 增加代码的可读性和可维护性
 2. 相比于 `#define`定义的全局变量,枚举有类型,更加严谨
 3. 防止命名污染(将整个枚举常量封装起来)
 4. 便于调试
 5. 使用方便,一次可定义多个枚举常量


2.3 枚举的使用


枚举的使用其实就是利用枚举常量本身就有一定的数值,然后给其他变量赋值。

例如


enum Sex
{
  //赋以初值
  nan=1,
  nv=2,
  secret=3
};
int main()
{
  enum Sex ma = nan;
  printf("%d\n", nan);
  return 0;
}

cc2e1112319b30de02de44da9f1665c0_d1a925dabd544d4bae7b06b45f326e18.png


3.联合(又称共用)


3.1 联合类型的定义


联合也是一种特殊的自定义类型,包含一系列的成员,特殊的是这些成员共用一块空间(也称作共用)


//联合类型的声明
union M
{
  char c;
  int i;
};
int main()
{
  //联合变量的定义
  union M m;
  //计算联合变量的大小
  printf("%d\n", sizeof(m));
  return 0;
}


d3a0a5e7e04e214b993601081e667c36_6bcf179868e34296a9ed0d4db48077eb.png

这里计算出的联合变量的大小就充分说明共用的思想,具体怎么共用的,接下来慢慢解析。


3.2 联合的特点


联合的成员是共用同一块内存空间,联合变量的大小至少是最大成员的大小
联合至少要能确保保存其中最大的成员。


union M
{
  char c;
  int i;
};
int main()
{
  union M m;
  printf("%p\n", &(m.c));
  printf("%p\n", &(m.i));
  return 0;
}


217d38555b784858bab988aa1eafd47e_2b50b4e3b78b4dff83bfb93b68761b9c.png

这里可以发现两个成员的地址是相同的,更一步体现了共用的思想


3.3 联合大小的计算


1. 联合的大小至少是最大成员的大小
 2. 当最大成员大小不是最大对齐数的整数倍时,联合的总大小就要
 对齐到最大对齐数的整数倍(4byte或者1byte)。


union M
{
  char c[5];
  int i;
};
int main()
{
  union M m;
  printf("%d\n",sizeof(m));
  return 0;
}


e3cccac1b3846e2330d8cd477e0a09fe_1bd192749fdf49f0b64e456428d48cf1.png


首先 char c[5],占5个字节, int i占4个字节,当然是共用的,此时联合总大小已是5个字节,由于最大成员 char c[5]的大小不是最大对齐数(4)的整数倍,联合的大小就要求对齐到最大对齐数的整数倍,最后联合的大小就是8个字节,下图便于理解


5909f76435d1db633270213415bc39fc_90e8f02292ca490abad9e87b4b948be2.png


可以利用联合共用内存空间这个特点,写个程序去判断大小端


int check()
{
  union M
  {
  char c;
  int i;
  }m;
  m.i = 1;
  return m.c;
}
int main()
{
  int ret = check();
  if (ret == 1)
  {
  printf("小端\n");
  }
  else
  printf("大端\n");
  return 0;
}

3974a999135bb806ac1899d3a9ed18c6_44b0d9d7571c418b94f36532d70e7faf.png

49fc092adb36c48136c7592cded1d212_47a15dc80d724e8b95a6684111427bea.png


相比于通过指针去访问然后返回,这个方法是非常的巧妙。

(这里的大小端在内存的存储中有详细的讲解

link感兴趣的可以去看看)


目录
相关文章
|
NoSQL MongoDB 数据库
MongoDB 解析:灵活文档数据库与 Docker Compose 部署
`MongoDB` 是一款开源、高性能的 `NoSQL` 数据库,以其无模式的文档存储格式(BSON)而著称,广泛应用于众多开源项目,包括但不限于 Yapi 等。它在大规模数据存储和实时数据处理方面表现出色,因此备受青睐。在本文中,我们将深入探讨 `MongoDB` 的特性,并详细阐述如何使用 Docker Compose 轻松部署 `MongoDB` 数据库,为你提供全方位的指导。
655 1
MongoDB 解析:灵活文档数据库与 Docker Compose 部署
|
安全 网络安全 定位技术
华为基础数通知识
了解基本的数通知识,成为更好的自己
|
存储 弹性计算 移动开发
玩机教程:阿里云电脑无影怎么样?怎么使用?
玩机教程:阿里云电脑无影怎么样?怎么使用?
1167 0
|
人工智能 分布式计算 大数据
开源大数据平台 3.0 技术解读
阿里云研究员,阿里云计算平台事业部开源大数据平台负责人王峰围绕新一代的流式湖仓、全面 Serverless 化、更智能的开源大数据等多维度解读开源大数据平台 3.0~
1752 1
开源大数据平台 3.0 技术解读
|
消息中间件 关系型数据库 MySQL
Flink最后一站___Flink数据写入Kafka+从Kafka存入Mysql
Flink最后一站___Flink数据写入Kafka+从Kafka存入Mysql
290 0
|
9月前
|
应用服务中间件 Linux nginx
部署使用 CHAT-NEXT-WEB 基于 Deepseek
本文介绍如何在阿里云轻量服务器上部署基于 `Deepseek` 的 `CHAT-NEXT-WEB` 项目。首先,准备一台 Linux 服务器并安装 Docker,确保防火墙允许特定端口访问。接着,通过阿里云容器镜像服务解决国内网络限制问题,将镜像推送到私有仓库并拉取到本地。配置并启动 `chat-next` 项目,使用 Deepseek API 进行优化。最后,安装 Nginx 和 Certbot 配置 HTTPS 访问,确保安全性和自动续签。整个过程需严格遵循官方文档,以避免因网络问题导致的安装失败。
|
编解码 开发工具 Android开发
Android平台GB28181设备接入侧如何实现GB28181-2022实时快照
GB/T28181-2022标准中明确了快照的具体要求,包括图像抓拍配置命令的发送与接收流程。源设备需向目标设备发送包含传输路径和会话ID等信息的命令,目标设备完成图像传输后,通过IETF RFC 3428中的MESSAGE方法发送图像抓拍传输完成的通知。图像格式推荐使用JPEG,且分辨率应与主码流相同。技术实现上,如使用大牛直播SDK在Android平台上,可通过创建`SnapShotImpl`类并调用`capture()`方法实现快照功能,之后将JPEG格式的快照文件上传至国标平台。
279 2
|
机器学习/深度学习 计算机视觉
TPAMI 2024:计算机视觉中基于图神经网络和图Transformers的方法和最新进展
【10月更文挑战第3天】近年来,图神经网络(GNNs)和图Transformers在计算机视觉领域取得显著进展,广泛应用于图像识别、目标检测和场景理解等任务。TPAMI 2024上的一篇综述文章全面回顾了它们在2D自然图像、视频、3D数据、视觉与语言结合及医学图像中的应用,并深入分析了其基本原理、优势与挑战。GNNs通过消息传递捕捉非欧式结构,图Transformers则结合Transformer模型提升表达能力。尽管存在图结构构建复杂和计算成本高等挑战,但这些技术仍展现出巨大潜力。论文详细内容见:https://arxiv.org/abs/2209.13232。
686 3
|
SQL Oracle Java
SQL中使用NEXTVAL获取序列值
SQL中使用NEXTVAL获取序列值
|
云安全 弹性计算 负载均衡
《阿里云认证的解析与实战-云计算ACP认证》——前言——二、云计算认证体系介绍
《阿里云认证的解析与实战-云计算ACP认证》——前言——二、云计算认证体系介绍