【C语言】自定义类型——枚举、联合体

引言

对枚举、联合体进行介绍,包括枚举的声明、枚举的优点,联合体的声明、联合体的大小。

 158c3f50b199454985017a51dbef9841.png               ✨ 猪巴戒:个人主页✨

               所属专栏:《C语言进阶》

        🎈跟着猪巴戒,一起学习C语言🎈

目录

引言

枚举

枚举的优点

联合(共用体)

 联合体的内存分布

如何通过联合体检验编译器的大小端?

联合体的大小

总结:


枚举

将事物一一列举出来,每个枚举常量都有一个取值。
下面就是枚举的具体格式,Mon,Tues,Wed这些就是枚举常量,每个枚举常量之间用逗号 隔开。枚举常量用大括号括在一起,记得结尾要有分号作为结尾。
枚举中的变量都是有初始值的,默认从0开始,后面就是递增1。下图将它们各自的值打出来。
enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};

181154d13d074a1aa5663c1fa71c98d6.png

枚举变量的取值也是可以直接定义的。 

enum Color//颜⾊
{RED=2,GREEN=4,BLUE=8
};

         

枚举的优点

通过定义宏,同样可以把各星期的取值打印出来。那枚举的优点是什么呢?

#define Mon 0
#define Tues 1
#define Wed 2
#define Thur 3
#define Fri 4
#define Sat 5
#define Sun 6

e77e0dd4e51545de9f95a1e0ce306adf.png

 枚举的优点

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

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

枚举变量都具有类型,转换的时候会更加严格。

enum Day d = Fri;
enum Day d = 5; //在C++的语法中会报错

3.防止命名污染(封装)

enum将各枚举变量封装起来。

4.便于调试

在#define在预处理阶段,define所定义的标识符就已经被替换了,调试所看到的代码和所写代码会有所差异。

而枚举中变量是不会替换的。

        

联合(共用体)

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

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

联合体的大小是联合体中成员的最大内存。

#include <stdio.h> 
union Un
{int a;char c;
};
int main()
{union Un u;printf("%d\n", sizeof(u));printf("%p\n", &u);printf("%p\n", &(u.a));printf("%p\n", &(u.c));return  0;
}

9f7935a6631144e9b12936c78433f045.png

         

 联合体的内存分布

联合体的成员共用同一块内存空间,因此联合体的大小至少是最大成员的大小。

联合体的特点:

1.联合体成员的地址是一样的

2.联合体的大小至少为最大成员的大小

联合体的成员内存是重叠的,因此联合体在同一时刻,只能使用一个联合体成员。

通过下面的例子,理解联合体的内存分布:

例子1:

#include <stdio.h>
union Un
{char c;int i;
};
int main()
{union Un un = { 0 };un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);return 0;
}

 由于是小端操作系统,数据在内存在的储存为小端字节序。

绿色表示联合体成员 i 。

3631b3825226476e987571b294bd571f.png

联合体的成员的地址是一样的,但是所占的字节不同。 

红色表示的是联合体成员 c 。

4771f171f84b44ecb59dd6872d8352f2.png

653d83f74f2c4dbdb1a835e9c8ef986e.png

         

如何通过联合体检验编译器的大小端?

一个数据 a = 0x11223344 在大小端字节序的不同排列

  小端字节序储存:

  • 把一个数据的低位字节序的内容存放在低地址处,把高位字节序的内容放在高地址处,就是小端字节序。

812bea8e79d645b69c52c8b12a475145.png

 大端字节序储存:

  • 把一个数据的高位字节序的内容存放在低地址处,把低位字节序的内容放在高地址处,就是大端字节序。

int a =0x11 22 33 44(这里用十六进制是为了表达)

459382accd64463f90bbb7c26dea0bf3.png

代码: 

#include <stdio.h>
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");elseprintf("大端\n");return 0;
}

解释:

如果是小端字节序,i 在内存中是 01 00 00 00,这个时候将 c 拿出来,就是那联合体的第一个字节。如果是1,那么就是小端字节序。

e905c6db8a7e4cf0a4c2ae8150406b8d.png

 如果是大端字节序,i 在内存中是 00 00 00 01,这个时候将 c 拿出来,就是那联合体的第一个字节。如果是0,那么就是大端字节序。

be35a49cc8514aaab4012f8b493c3917.png         

联合体的大小

联合体的大小也存在对齐。

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

对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。

- VS 中默认的值为 8

- Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩

 例子1:

下面的打印结果是什么?

#include <stdio.h>
union Un
{char arr[5];int i;
};
union Un2
{short c[7];int i;
};
int main()
{printf("%d\n", sizeof(union Un));printf("%d\n", sizeof(union Un2));return 0;
}

Un的最大成员是 i ,4个字节的大小,arr[5]的内存如下,联合体Un的大小要对齐,对齐到4的整数倍,因此联合体Un的大小为8个字节。

16f66c0ef39943baa4ce220bdacd6f2e.png

Un2的最大成员是 i, 4个字节的大小,short[7]的内存如下,联合体Un2的大小要对齐,对齐到4的整数倍,因此联合体Un2的大小为16个字节。

52ef3c2873e64986a287175847f8f36d.png

 1eee6f2a1a834830b199b633a2637e7f.png

总结:

  1. 枚举(将事物一一列举出来,每个枚举常量都有一个取值)
  2. 枚举的优点
  3. 联合体,联合体的内存分布 
  4. 联合体的大小

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

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

相关文章

06. Python模块

目录 1、前言 2、什么是模块 3、Python标准库模块 3.1、os模块 3.2、datetime 模块 3.3、random模块 4、自定义模块 4.1、创建和使用 4.2、模块命名空间 4.3、作用域 5、安装第三方依赖 5.1、使用 pip 安装单个依赖 5.2、从 requirements.txt 安装依赖 5.3、安装指…

还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis

文章目录 前言一、&#x1f4d6;MyBatis简介1.Mybatis历史2.MyBatis特性3.对比&#xff08;其他持久化层技术&#xff09; 二、&#x1f4e3;搭建MyBatis1.开发环境2.创建maven工程3.创建MyBatis核心配置文件4.创建mapper接口5.创建MyBatis的映射文件6.通过junit测试功能7.加入…

OpenCV4工业缺陷检测的六种方法

机器视觉 机器视觉是使用各种工业相机&#xff0c;结合传感器跟电气信号实现替代传统人工&#xff0c;完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成&#xff0c;特别是传统的3C制造环节&#xff0c;产品缺陷检测依赖于人…

python+torch线性回归模型机器学习

程序示例精选 pythontorch线性回归模型机器学习 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《pythontorch线性回归模型机器学习》编写代码&#xff0c;代码整洁&#xff0c;规则&#xf…

USB2.0 Spec

USB System Description A USB system is described by three definitional areas: • USB interconnect • USB devices • USB host USB interconnect The USB interconnect is the manner in which USB devices are connected to and communicate with the host. USB Ho…

docker基本命令

1.docker命令图解 2. 从仓库拉取镜像 #下载最新版 docker pull nginx # 镜像名:版本名&#xff08;标签&#xff09; docker pull nginx:1.20.1docker rmi 镜像名:版本号/镜像id3. 容器启动及停止 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] docker run [设置项] 镜…

R语言【rgbif】——occ_search对待字符长度大于1500的WKT的特殊处理真的有必要吗?

一句话结论&#xff1a;只要有网有流量&#xff0c;直接用长WKT传递给参数【geometry】、参数【limit】配合参数【start】获取所有记录。 当我在阅读 【rgbif】 给出的用户手册时&#xff0c;注意到 【occ_search】 强调了 参数 【geometry】使用的wkt格式字符串长度。 文中如…

使用数组模拟栈的相关操作【栈1.1】

public class ArrayStackDemo {public static void main(String[] args) {ArrayStack arrayStack new ArrayStack(4);Scanner sc new Scanner(System.in);boolean loop true;char key ;while (loop) {System.out.println("栈操作菜单项");System.out.println(&q…

范仲淹仅存五首词作,篇篇经典

范仲淹&#xff0c;北宋时期杰出的政治家&#xff0c;文学家&#xff0c;提起他首先想到初中那篇《岳阳楼记》&#xff0c;难倒无数背诵困难户&#xff0c;它虽然难背&#xff0c;但却是一篇文字排列极美&#xff0c;意境极佳的美文。 “不以物喜&#xff0c;不以己悲&#xf…

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…

程序人生,由“小作文”事件想到的

时势造英雄。自媒体时代&#xff0c;火出圈是靠大众的审美和爱好&#xff0c;自己能做的关键&#xff0c;其实是做好自己&#xff0c;选择向上生长&#xff0c;持续不断的读书、学习。同时保持一份好奇心&#xff0c;培养一个兴趣爱好并自得其乐。 展示自我 回想起我小时候&am…

Promise执行顺序

小编建议小伙伴们不要跳点看&#xff0c;每一点都是衔接&#xff0c;有比较的 本篇文章考查 ①promise是同步任务还是微任务 ②promise.then()什么时候执行&#xff0c;是微任务还是宏任务 ③如何控制状态变化&#xff0c;不同状态变化&#xff0c;会执行哪个回调函数 1、以下代…

进制之间的转换——n进制转换为m进制(C/C++实现,简单易懂)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 什么是进制转换&#xff1a; &#x1f4c1;其他进制转换成十进制&#xff1a; &#x1f4c2;二进制( B ) ——> 十进制( D ) &#x1f4c2;八进制( O ) ——> 十进制( D ) &#x1f4c2;十六进制( H ) ——> 十进制…

运维实践|采集MySQL数据出现many connection errors

文章目录 问题出现问题分析当前环境问题分析 解决方案1 检查调度事件任务是否开启2 开启调度事件任务3 创建一张日志表4 创建函数存储过程5 创建事件定时器6 开启事件调度任务7 检查核实是否创建 总结 问题出现 最近在做OGG结构化数据采集工作&#xff0c;在数据采集过程中&am…

抖音商品详情API接口在电商行业中的重要性及实时数据获取实现

随着移动互联网的快速发展&#xff0c;电商行业不断壮大。抖音作为一款短视频社交应用&#xff0c;近年来在电商领域取得了显著成果。本文将探讨抖音商品详情API接口在电商行业中的重要性&#xff0c;以及如何通过实时数据获取提高业务效率。我们将介绍相关的技术背景、API接口…

AngularJS

理解实现代码的逻辑为主要&#xff0c;代码怎么写为次要。 参考资料&#xff1a; 《AngularJS入门与进阶》&#xff0c;江荣波著 前端开发常用框架 React&#xff1a;由Facebook开发&#xff0c;用于构建用户界面的JavaScript库&#xff0c;以组件化和虚拟DOM著称。 Angular&…

2024最新FL Studio21.2MAC电脑版中文版下载安装步骤教程

FL Studio 简称FL&#xff0c;全称Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前最新版本是FL Studio21.1.1.3750版本&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破…

docker的资源限制及容器应用

一、docker资源限制 在使用 docker 运行容器时&#xff0c;一台主机上可能会运行几百个容器&#xff0c;这些容器虽然互相隔离&#xff0c;但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制&#xff0c;那么容器之间会互相影响&#xff0c;小的来说…

DC-5靶场

目录 DC-5靶机&#xff1a; 先进行主机发现&#xff1a; 发现文件包含&#xff1a; 上传一句话木马&#xff1a; 反弹shell&#xff1a; 提权漏洞利用&#xff1a; 下载exp&#xff1a; 第一个文件 libhax.c 第二个文件r…

电子电器架构( E/E) 演化 —— 大算力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…