C语言王国——深入自定义类型(联合体、枚举)

目录

一、引言

二、联合体

2.1 联合体类型的声明

2.2 联合体大小的计算

2.3 联合体的实践运用

2.4 用联合体测试大小端字节序

三、枚举

3.1 枚举类型的声明

3.2 枚举类型的特点

四、总结


一、引言

我们刚学完了结构体,相信大家对自定义类型也有了些许了解,但是自定义类型中还有两个我们尚未学习,它们也急不可耐的想展现在我们面前了,所以接下来就由姜糖来带大家认识一下吧!


二、联合体

2.1 联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所 以联合体也叫:共用体

所以联合体的声明和结构体类似,结构体的关键词是struct,而联合体的关键词是union。

union Un
{char a;int b;
};

2.2 联合体大小的计算

接下来我们再来探讨一下联合体的存储大小,我们用代码测试一下上面定义的联合体:

#include<stdio.h>union Un
{char a;int b;
}un;int main()
{printf("%zd", sizeof(un));return 0;
}

打印结果为:

 而如果此为结构体,考考大家前面学过的知识,应该为多少呢?        ·(答案为8)

那么我们发现,联合体和结构体的存储模式是不一样的。那么联合体是怎么存储的呢?

联合体的存储规则:

  • 联合体的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。 

首先我们来了解第一句话, 正如我们前面讲到的那样,联合体的特点是所有成员共用同⼀块内存空间,所以联合体大小至少是最大成员的大小,不然当我们用到最大成员时,联合体就存储不下了。

那么接下来我们用代码看看联合体的成员是否是共用一块内存空间:

#include<stdio.h>union Un
{char a;int b;
}un;int main()
{printf("%p\n", &un);    //联合体的地址printf("%p\n", &(un.a));//联合体中a成员的地址printf("%p\n", &(un.b));//联合体中b成员的地址return 0;
}

打印结果如下:

我们发现它们的地址是一样的,我们可以确认它们都为应该地址,为了更加确定这个观点,我们来进一步测试:

#include<stdio.h>union Un
{char a;int b;
}un;int main()
{un.b = 0x11223344;un.a = 0x66;printf("%x", un.b);//看看a的改变是否影响breturn 0;
}

打印结果如下:

 所以可以更一步的确定它们共用一块内存,所以这个联合体的图为:

所以我们发现联合体比结构体更节约存储空间。

而第二句话我们该怎么理解呢?

我们用代码具体分析,比如:

union Un
{char a[6];int b;
}un;int main()
{printf("%zd", sizeof(un));return 0;
}

那么之里面的最大成员为char a[6],那么大小就为6了吗,真的是这样子的吗?那我们来看打印结果:

结果不为6而为8 ,而这里和结构体一样要对齐

所以最后6应该变成4的倍数8。 

我们也发现,其实联合体深入节约存储空间但也会存在内存浪费的现象。

2.3 联合体的实践运用

那么我们学习了联合体,那联合体有什么实际运用呢?

大家在前面的学习中也发现了联合体的节约空间的性质,那么实际运用中也和节约空间密不可分,比如生活中常见的事务的分类,那我们拿书、手机、手表来举例。

首先书、手机、手表都是一个大类——售卖的商品

手机:价格、品牌

书:价格、作者、书名

手表:价格、品牌、工艺

那么它们的结构体该怎么写呢?

struct commodity
{//公共属性int price;	//价格//私有属性char brand[10];//品牌char author[10];//作者char title[10];//书名char workmanship[10];//工艺
};

我们发现这里有很多私有属性,会被大量浪费。当这些私有属性共用一块内存空间时是不是可以大大节约空间的浪费所以接下来,我们用union联合体来优化代码:

struct commodity
{int price;	//价格union{struct{char brand[10];//品牌}phone;struct{char author[10];//作者char title[10];//书名}book;struct{char workmanship[10];//工艺char brand[10];//品牌}Wristwatch;}item;
};

这样设计结构体就能大大减少空间的浪费。 

2.4 用联合体测试大小端字节序

在学习的过程中我们也发现联合体非常适合去测试大小端的字节序,因为前面我们在测试大小端的时候我们是将同一个内存强制类型转换的,而这里我们用联合体将两个类型保存在同一个空间中就行了,代码如下:

#include<stdio.h>union Un
{int a;char b;
};int main()
{union Un un = { 0 };un.a = 1;if (un.b == 1){printf("为小端");}elseprintf("为大端");return 0;
}


三、枚举

3.1 枚举类型的声明

枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。

而我们生活中有很多可以一一列举的事务,如星期,月份,三原色等等,比如三原色的枚举: 

emun Threeprimarycolors
{red;blue;green;
};

{}中的内容是枚举类型的可能取值,也叫 枚举常量。这些可能取值都是有值的,默认从0开始,依次递增1:

比如这里的red就为0,blue就为1green就为2

当然在声明枚举类型的时候也可以赋初值:

emun Threeprimarycolors
{red;blue = 6;green;
};

这样就blue就变成了6,前面没有赋值的就按照原来的从0开始,red0,赋值后面的则继续加一,green就为7

3.2 枚举类型的特点

我们发现枚举和#define定义非常相像,那么我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点:

1. 增加代码的可读性和可维护性。

2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

3. 便于调试,预处理阶段会删除 #define 定义的符号。

4. 使用方便,⼀次可以定义多个常量

5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。


四、总结

C语言的内容不止于此,还有更多需要我们共同发现,今天C语言的内存数据管理就到这里啦。如果姜糖有讲的不好的地方欢迎大家提出,谢谢大家,也希望大家能一键三连哦!


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

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

相关文章

【代码随想录】【算法训练营】【第50天】 [1143]最长公共子序列 [1035]不相交的线 [53]买卖股票的最佳时机III [392]判断子序列

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 50&#xff0c;周三&#xff0c;无法坚持~ 题目详情 [1143] 最长公共子序列 题目描述 1143 最长公共子序列 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语…

07 - matlab m_map地学绘图工具基础函数 - 绘制等高线

07 - matlab m_map地学绘图工具基础函数 - 绘制等高线 0. 引言1. 关于绘制m_contour2. 关于绘制m_contourf3. 关于绘制m_elev4. 结语 0. 引言 本篇介绍下m_map中添加绘制等高线的一系列函数及其用法&#xff0c;主要函数包括m_elev、m_contour、m_contourf还有一些函数也和绘制…

初探海龟绘图

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 海龟绘图是Python内置的模块&#xff0c;在使用前需要导入该模块&#xff0c;可以使用以下几种方法导入&#xff1a; l 直接使用import语句导入海龟…

【OceanBase诊断调优】—— 如何通过trace_id找到对应的执行节点IP

1. 前言 OceanBase作为分布式数据库&#xff0c;查问题找对节点很关键。好在OceanBase执行的每一条SQL都能通过trace_id来关联起来&#xff0c;知道trace_id怎么知道是在哪个节点发起的呢&#xff0c;请看本文。 2. trace_id生成规则 ob内部trace_id的生成函数如下&#xff0…

[AIGC] ClickHouse:一款高性能列式数据库管理系统

轮流探索数据库的世界&#xff0c;我们不得不提到一个重要的角色——ClickHouse。ClickHouse是一个开源的列式数据库管理系统(DBMS)&#xff0c;以其卓越的性能&#xff0c;高效的查询能力和易扩展性而被业界广泛关注&#xff0c;尤其在大数据分析方面。 文章目录 1. 什么是 Cl…

LeetCode 算法:将有序数组转换为二叉搜索树 c++

原题链接&#x1f517;&#xff1a;将有序数组转换为二叉搜索树 难度&#xff1a;简单⭐️ 题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9]…

LinkedBlockingQueue 原理

基本的入队出队 public class LinkedBlockingQueue<E> extends AbstractQueue<E>implements BlockingQueue<E>, java.io.Serializable {static class Node<E> {E item;/*** 下列三种情况之一* - 真正的后继节点* - 自己, 发生在出队时* - null, 表示是…

解决因国内各大镜像站关停导致无法下载镜像的问题

方法1 配置镜像加速 vim /etc/docker/daemon.json {"exec-opts": ["native.cgroupdriversystemd"],"registry-mirrors": ["https://0fivaqt3.mirror.aliyuncs.com","https://hub.appifa.com","https://dockerproxy.co…

[面试题]Zookeeper

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

windows桌面运维----第九天

1、新的电脑需要安装哪些驱动&#xff1a; 显卡驱动、声卡驱动、主板驱动、网卡驱动、打印机驱动、外设驱动、 2、网络打印机如何开启打印机共享核客户端连接共享打印机&#xff1a; 一、打开控制面板并定位到设备和打印机&#xff1a; 首先&#xff0c;我们在电脑桌面上找…

【C/C++】Code Style

命名规范 代码元素命名风格注释Namespaceunder_scored为了跟类名做区分Class nameCamelCase为了跟标准库的类名做区分 (建议不要使用大写"C" 或者 “T” 作为前缀)Function namecamelCase小写开头的函数名基本是通用的&#xff0c;除了.Net自成一格Parameters/Local…

【C语言】操作符(上)

目录 1. 操作符的分类 2. 原码、反码、补码 3. 移位操作符 3.1 左移操作符 3.2 右移操作符 4. 位操作符&#xff1a;&、|、^、~ 5. 单目操作符 6. 逗号表达式 最近准备期末考试&#xff0c;好久不见啦&#xff0c;现在回归—— 正文开始—— 1. …

fc-list命令使用指南

fc-list命令使用指南 一、什么是fc-list? fc-list是FontConfig库的一部分&#xff0c;最初为Linux和其他Unix-like系统开发。我们可以用这个命令行快速查询和列出系统中安装的字体。 现在&#xff0c;Windows用户也集成了这个工具&#xff0c;所以我们来讲解一下用法。 二、…

路经src里的文件是?

说明&#xff1a; src 目录指的是源代码&#xff08;source code&#xff09;目录&#xff0c;存放项目应用的源代码&#xff0c;包含项目的逻辑和功能实现&#xff0c;实际上线之后在浏览器中跑的代码就是它们 apis - 业务接口assets - 静态资源 &#xff08;图片&#xff09…

《昇思 25 天学习打卡营第 7 天 | 模型训练 》

《昇思 25 天学习打卡营第 7 天 | 模型训练 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 模型训练 本章节-结合前几张的内容所讲-算是一节综合实践 mindscope 框架使用张量 数据类型数据集下载与加载网络构建函…

mulesoft --环境安装与搭建

1.mavenjdkpostman 2.anypoint statdio 下载安装 下载 Anypoint Studio & Mule |骡子软件 (mulesoft.com) 填好基本信息后&#xff0c;会发邮件&#xff0c;在邮件中下载&#xff0c;跳到官网下载 3注册账号 Download Anypoint Studio & Mule | MuleSoft 4.Connect…

PostgreSQL 高可用性与容错性(十三)

1. 备份与恢复策略 1.1 数据备份 1.1.1 基于 pg_dump 的逻辑备份 pg_dump -U username -d dbname -f backup_file.sql 1.1.2 基于 pg_basebackup 的物理备份 pg_basebackup -U username -D /path/to/backup/directory -Ft -Xs -P -R 1.2 恢复数据库 1.2.1 恢复逻辑备份 …

详解 ClickHouse 的分片集群

一、简介 分片功能依赖于 Distributed 表引擎&#xff0c;Distributed 表引擎本身不存储数据&#xff0c;有点类似于 MyCat 之于 MySql&#xff0c;成为一种中间件&#xff0c;通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据 ClickHouse 进行分片集群的…

C语言基础——函数(2)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 文章目录 前言 一、return语句 二、数组做函数参数 三、嵌套调用和链式访问 3.1 嵌套调用 3.2 链式访问 四、函数声明和定义 4.1 单个文件 4.2 多个文件 总结 前言 大家好啊&#xff0c;继我们上一…

优化系统小工具

一款利用VB6编写的系统优化小工具&#xff0c;系统优化、桌面优化、清理垃圾、查找文件等功能。 下载:https://download.csdn.net/download/ty5858/89432367