【C语言】自定义数据类型:枚举+共用体

news2025/1/12 23:08:34

前言

之前我们学习了自定义数据类型里的结构体,还顺带着学习了位段
今天,我们就来学习枚举和共用体,我们开始吧

自定义类型:结构体

位段详解

枚举

枚举就是一一列举

枚举类型的定义

枚举类型的创建

enum Day
{
	mon,//此处是逗号
	tues,
	thur,
};//;不能少

enum:是类型关键字
{}里的就是可能的取值,都是常量
第一个常量的值默认是0,之后挨个增加

初始值可以改变,当不改变时就认为是前一个常量的值加一
下面给出三个例子方便大家理解

1

enum Day
{
	mon,
	tues,
	thur,
};

int main()
{
	enum Day d1 = mon;
	printf("%d %d %d\n", mon, tues, thur);
	return 0;
}

运行结果:
在这里插入图片描述

2

enum Day
{
	mon = 1,
	tues = 3,
	thur = 5,
};

int main()
{
	enum Day d1 = mon;
	printf("%d %d %d\n", mon, tues, thur);
	return 0;
}

运行结果:
在这里插入图片描述

3

enum Day
{
	mon,
	tues = 3,
	thur,
};

int main()
{
	enum Day d1 = mon;
	printf("%d %d %d\n", mon, tues, thur);
	return 0;
}

运行结果:
在这里插入图片描述

枚举类型的使用

enum Day
{
	mon,
	tues,
	thur,
};

int main()
{
	enum Day d1 = mon;

	return 0;
}

创建变量需要写上关键字,并且变量的值只能是定义中的某一个值

注意

不要给枚举常量赋值,这是错误的

enum Day d2 = 4;

枚举类型的大小

我们用一段代码来解释这个问题:

enum Day
{
	mon,
	tues,
	thur,
};

int main()
{
	enum Day d1 = mon;
	printf("%zd\n", sizeof(d1));

	return 0;
}

运行结果:
在这里插入图片描述

原因

因为上文提到了,mon这些成员的值默认是整数,都是int类型

所以我们可以知道他们的大小都是4个byte

注意

枚举类型的值是不可改变的,是由编译器决定的,所以大小就是固定的4byte

枚举的优点

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

联合(共用体/联合体)

联合的定义


union Un
{
	char c;
	int i;
};

int main()
{
	union Un u;

	return 0;
}

union是联合关键字

联合的特点

先来看一段代码,下面代码的结果是什么

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u;

	printf("%zd\n", sizeof(u));

	printf("%p\n", &u);
	printf("%p\n", &(u.i));
	printf("%p\n", &(u.c));

	return 0;
}

运行结果:
在这里插入图片描述
能看出来,他们的地址是相同的,也就是说他们都从同一块空间开始存储、占用同一块空间,这就是共用体的名称来源

所以联合体至少是最大成员的大小,在上面这道题中,就是4

提示

因为成员都从同一块空间存储,所以不能同时使用

联合体的使用

引入

先看一道笔试题:

判断当前机器的大小端存储(字节存放顺序)

使用指针

int check_sys()
{
	int a = 1;
	return *(char*)&a;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小\n");
	}
	else
	{
		printf("大\n");
	}

	return 0;
}

使用联合体

int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;//此处可以像结构体一样,创建一个全局的联合体变量
	u.i = 1;
	return u.c;//返回的是第一个字节
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小\n");
	}
	else
	{
		printf("大\n");
	}

	return 0;
}

联合体的大小

下面这段代码的运行结果是:

union Un
{
	int a;
	char arr[5];

};

int main()
{
	union Un u;
	printf("%zd\n", sizeof(u));

	return 0;
}

计算联合体大小的规则

联合体的大小至少是最大成员的大小(类似结构体)

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

数组的对齐数:用其中一个元素的大小来和默认值比较

由上可知,4+1+3 == 8,结果是8

结语

自定义数据类型的知识介绍到这里就结束了,感觉收获很多呢

之后我利用已经学会的知识来尝试去实现通讯录,我们下篇文章见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915351.html

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

相关文章

【前端从0开始】JavaSript——自定义函数

函数 函数是一个可重用的代码块,用来完成某个特定功能。每当需要反复执行一段代码时,可以利用函数来避免重复书写相同代码。函数包含着的代码只能在函数被调用时才会执行,就可以避免页面载入时执行该脚本在JavaScript中,可以使用…

ChatGpt开源项目完美运行配置(ChatGml2)

(以下所有软件均可免费在网盘获取。) 任务描述 本节任务是安装和配置chatgpt项目所需的软件以及chatgpt项目所需要的python库包,同时编写python代码来完成chatgpt项目的人机对话功能。 实验工具 显卡GTX1070(专用内存需要大于等…

map和set等关联式容器特性

1. 关联式容器 在初阶阶段,我们已经接触过 STL 中的部分容器,比如: vector 、 list 、 deque 、 forward_list(C11) 等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面 存储的是元素本身…

2023河南萌新联赛第(六)场:河南理工大学 L - 阴晴不定的大橘学长

2023河南萌新联赛第(六)场:河南理工大学 L - 阴晴不定的大橘学长 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 在通往院楼的道路上&a…

Android学习之路(9) Intent

Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: 启动 Activity Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity()&…

【SQL应知应会】索引(三)• MySQL版:聚簇索引与非聚簇索引;查看索引与删除索引;索引方法

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 索引 • MySQL版 前言一、索引1.简介2.索引类型之逻…

Struts vs. Struts 2:Java Web 开发框架的升级之路与竞争力分析

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

算法 | 活用双指针完成复写零操作

Problem: 1089. 复写零 文章目录 题目解析算法原理分析找到最后一个复写的位置从后往前进行复写操作 代码展示 题目解析 首先我们来分析一下本题的题目意思 可以看到题目中给到了一个数组,意思是让我们将数组中的零元素都复写一遍,然后将其余的元素向后平…

VMware和ubuntu配置Hadoop环境

本博客主要是为了学校课程”大数据与云计算“需要安装Hadoop而写,希望这篇博客对各位阅读这篇博客的人有所帮助。废话不多说,下面直接开始配置教程。 一、获取VMware安装包 VMware获取方法有很多种,这里我准备了官网获取和从我准备的资料中获…

jstat -gcutil PID命令分析

jstat -gcutil命令打印出的数据可以用来分析Java应用程序的垃圾回收情况。 jstat -gcutil命令打印出的数据可以用来分析Java应用程序的垃圾回收情况。该命令输出的数据包括以下几个关键指标:- S0:幸存者空间0(Survivor Space 0)的…

详解I/O多路转接模型:select poll epoll

文章技术分享思路:从select模型开始,先了解select模型的理论基础,然后编写简单的基于select的tcp服务器,接着分析出select的特点和缺点。引出poll模型,了解了poll模型的基础理论,编写简单的基于poll的tcp服…

十二、执行引擎

这里写自定义目录标题 一、执行引擎概述二、Java代码的编译和执行的流程三、机器码、指令、汇编语言四、解释器五、JIT编译器 一、执行引擎概述 二、Java代码的编译和执行的流程 三、机器码、指令、汇编语言 高级语言 四、解释器 五、JIT编译器

Wlan——Wlan服务集与Wlan漫游的概念

目录 Wlan服务集的基本概念 无线漫游基本概念 无线漫游的分类 无线漫游的数据转发路径 二层本地转发漫游 三层本地转发漫游 二/三层集中转发漫游 无线漫游注意事项 Wlan服务集的基本概念 概念 全称 描述 BSS 基本服务集BSS 无线网络的基本服务单元 可以理解为1个A…

【0822作业】定义一个学生的结构体,设置私有权限,共有函数实现赋值并输出

定义一个学生的结构体,包含学生的姓名,年龄,成绩,性别,学生的成绩,姓名,定义为私有权限;定义一个学生类型的结构体变量,设置公有函数用于给学生的成绩和名字进行赋值&…

Ajax 请求到底应该放在 created 里还是 mounted 里???

示例代码 定义了一个数据 list,默认是空数组 定义了一个 API 请求,getDat 还定义了两个生命周期钩子 created 和 mounted 分析在 created 里的情况 这个时候,我们是能够成功发送 API 请求获取到数据的,控制台会打印 created&…

【Redis】——Redis基础的数据结构以及应用场景

什么是redis数据库 Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。,Redis 还支持 事务 、持久化、Lua 脚本、多种集群方案(主…

本地CPU部署运行ChatGLM2-6B模型

1、前期准备: 需要下载模型文件 2、部署过程及碰到的问题 (1)编译安装python 3.8.13 (Asianux release 7.6.18 gcc 4.8.5) 按运行的要求需要安装torch的>2.0,因此安装了torch的2.0.1,该版本的torch …

简析SCTP开发指南

目录 前言一、SCTP基本概念二、SCTP开发步骤1. **环境配置**:2. **建立Socket**:3. **绑定和监听**:4. **接收和发送数据**:5. **关闭连接**: 三、 C语言实现SCTP3.1SCTP客户端代码:3.2 SCTP服务器端代码&a…

关于伪装UserAgent知识总结

关于伪装UserAgent知识总结,可以根据自己实际应用环境去选择合适的节点,加入相应的代码即可: 1. 不缓存数据,不使用ssl 验证 from fake_useragent import UserAgentua UserAgent(verify_sslFalse,use_cache_serverFalse)2. 禁用…

C. Another Array Problem

思路:这个题没想到吧数先往0上搞,然后一直想不出来,为什么要先往0上搞呢,对于每个数来说,它最大只会变成这一堆数的最大值,所以我们考虑能不能变成最大值,那么只要是两个相等的数通过一次操作就…