C语言自定义类型讲解:结构体,枚举,联合(2)

🐵本篇文章将会对位段、枚举和联合的相关知识进行讲解


1. 位段📚

1.1 什么是位段

位段的声明和结构体类似,但是有两点不同:

1.位段的成员必须是int,unsigned int,signed int (C99之后也可以是其他成员,但一般是int, char)

2.位段的成员的后面都有一个冒号和一个数字,代表该成员所占的比特位

假如A是一个普通的结构体,那么此时A的大小为16个字节,那么位段A的大小是多少?

struct A
{int a : 2;int b : 5;int c : 10;int d : 30;
};
printf("%zd\n", sizeof(struct A));

得到的结果为8,可以看出位段相比于结构体更能节省空间,那位段是怎么分配内存空间的,为什么A的大小是8个字节?

1.2 位段的内存分配

位段在空间上按照4个字节(int)或一个字节(char)为单位来开辟的,也就是当位段成员主要是int时,它会先开辟4个字节,当不够用时会再开辟4个字节;当位段成员主要是char时,它会先开辟1个字节,当不够用时会再开辟1个字节

除此之外,位段还有许多跨平台问题:

1. int位段究竟是无符号unsigned int还是有符号signed int是不确定的

2. int位段的最大位段数是不确定的,因为在16位机器上int占2个字节,在32位机器上int占4个字节

3. 位段成员在内存中是从左到右分配还是从右到左分配是不确定的,比如还是以上题为例,由于位段成员主要是int类型,所以位段在空间上按4个字节为单位来开辟的,先开辟4个字节:

4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的

比如char位段,先开辟一个字节,a占6个比特位,b占4个比特位

下面以一个例题为例:

struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.d = 4;return 0;
}

2. 枚举📚

枚举就是一一列举

2.1 枚举的定义

enum Color
{RED,GREEN,BLUE
};

每一个枚举常量都有对应的值,第一个枚举常量的默认值为0,之后依次递增1,在上述代码中枚举常量RED的值为0,GREEN为1,BLUE为2

enum Color
{RED,GREEN,BLUE
};int main()
{printf("%d", RED); //打印结果为0return 0;
}

我们也可以修改默认值

enum Color
{RED = 3,GREEN,BLUE
};

这样RED的值就变成了3,GREEN和BLUE也依次变为4和5

2.1 枚举的使用

enum Color
{RED,GREEN = 5,BLUE
};int main()
{enum Color clr = GREEN;//给枚举类型的变量赋值时要用枚举常量clr = 6; //这种形式的代码在vs的.c文件中不会报错,这是因为vs的.c文件对类型检查不够严格,当把.c文件改为.cpp文件时,程序就会报错,所以不建议这样写代码return 0;
}

3. 联合📚

3.1 联合的定义

联合体(共用体)也是一种自定义类型,它也包含一系列的成员,它的特征是这些成员共用同一空间

union un
{char c;int i;
};int main()
{union un u; //创建联合体变量printf("%p\n", &u); //求变量的地址printf("%p\n", &u.c); printf("%p\n", &u.i); //求成员的地址return 0;
}

有打印结果可以看出联合体的内部成员共用同一块空间;

深度剖析数据在内存中的存储中讲解过大小端存储模式,当时写过判断大小端存储模式的代码:

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;
}

3.2 计算联合的大小

联合体的成员共用同一块内存空间,一个联合体变量的大小至少是其最大成员的大小,因为当最大成员的大小不是最大对齐数的整数倍时就要对齐到最大对齐数的整数倍处

union un
{char c[5];int i;
}u;int main()
{printf("%zd", sizeof(u)); //结果为8return 0;
}

上述代码中c的对齐数是1,i的对齐数是4,所以最大对齐数是4,而char c[5]的大小是5个字节,所以要再浪费3个字节对齐到4的倍数也就是8个字节


🙉至此,有关结构体、位段、枚举和联合的知识全部讲解完毕;之后会讲解动态内存管理

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

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

相关文章

【C语言】通讯录

目录 一、关于通讯录 二、代码逻辑 三、通讯录实现 1.菜单设计 2.逻辑主要功能设计 3.增加联系人功能实现 4.显示全部联系人信息 5.删除联系人 6.查找联系人 7.修改联系人信息 8.对联系人进行排序 9.一键清空所有联系人 四、完整源码 test.c contact.c contact.…

Smart UI Web 16.0.1 WebComponents htmlelements Crack

Javascript Web 组件库 Smart UI Web 组件库是您构建令人惊叹的 Web 应用程序所需的唯一套件。它包含 70 多个快速且专业设计的 UI 组件,可在单个包中实现美观且始终现代的 Web 应用程序。 具有高级功能的即用型Javascript 组件。只需几行代码即可使用数据网格、甘特…

Docker 容器编排

是什么 Docker-Compose是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个…

什么是关系模型? 关系模型的基本概念

关系模型由IBM公司研究员Edgar Frank Codd于1970年发表的论文中提出,经过多年的发展,已经成为目前最常用、最重要的模型之一。 在关系模型中有一些基本的概念,具体如下。 (1)关系(Relation)。关系一词与数学领域有关,它是集合基…

干货 | 基于在线监控数据的非现场监管问题识别模型研究

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 我们汇报的题目是基于在线监控数据的非现场监管问题识别模型研究,我们的汇报将从五个部分展开。首先是项目背景说明,该项目是为了遏制企业逃避监管行为的发生…

(自学)黑客技术——网络安全

如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日,2023世界智能网联汽车大会(以下简称大会)在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办,是我国首个经国务院批准的…

希望杯、希望数学系列竞赛辨析和希望数学超1G的真题和学习资源

中国的中小学数学竞赛种类非常多,但是说到全国性的数学竞赛,影响力最大的之一就是“希望杯”,在2017年国家喊停学科竞赛后,“希望杯”逐步停止了,但是鉴于希望杯的巨大影响力,以及背后的利益纠葛&#xff0…

域名备案流程(个人备案,腾讯云 / 阿里云)

文章目录 1.网站备案的目的2.备案准备的材料2.1 网站域名2.2 云资源或备案授权码2.3 电子材料 3.首次个人备案准备的材料3.1 主体相关3.2 域名相关3.3 网站相关3.4 网站服务相关3.5 变更相关 4.个人备案流程4.1 登录系统4.2 填写备案信息🍀 填写备案省份&#x1f34…

2023 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|数学建模完整代码+建模过程全解全析

​ 问题一 血肿扩张风险相关因素探索建模 思路: 根据题目要求,首先需要判断每个患者是否发生了血肿扩张事件。根据定义,如果后续检查的血肿体积比首次检查增加≥6 mL或≥33%,则判断为发生了血肿扩张。 具体判断步骤: (1) 从表1中提取每个患者的入院首次影像检查…

十大直线导轨品牌

在现如今的制造业领域中,直线导轨作为重要的传动元件,广泛应用于各种机械装置中,以下是十个在直线导轨领域具有优秀表现的品牌,我们一起来看看: 1、日本THK,致力于开发、生产并且销售LM滚动导轨、滚珠花键、…

设计模式篇---桥接模式

文章目录 概念结构实例总结 概念 桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。 毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*1236支,毛笔需要…

什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的IIFE⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们…

【JavaEE】多线程(三)

多线程(三) 续上文,多线程(二),我们已经讲了 创建线程Thread的一些重要的属性和方法 那么接下来,我们继续来体会了解多线程吧~ 文章目录 多线程(三)线程启动 startsta…

Git学习笔记4

GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私有仓库是需要付费的。 到Github上找类似的项目软件。 GitLab可以创建免费的私有仓库。 GitLab是利用 Ruby开发的一个开源的版本管理系统,实现一个…

【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

基于STM32+华为云IOT设计的智能车库管理系统

一、项目介绍 随着城市化进程和汽车拥有率的不断提高,停车难的问题也日益凸显。在城市中,停车场是一个非常重要的基础设施,但是传统的停车场管理方式存在很多问题,比如车位难以管理、停车费用不透明等。为了解决这些问题&#xf…

时间轮算法

思考 假如现在有个任务需要3s后执行,你会如何实现? 线程实现:让线程休眠3s 如果存在大量任务时,每个任务都需要一个单独的线程,那这个方案的消耗是极其巨大的,那么如何实现高效的调度呢? 时…

goadmin 学习笔记

1.安装命令行 Following three steps to run it. Note: now you can quickly start by doing like this. $ go install github.com/GoAdminGroup/admlatest $ mkdir new_project && cd new_project $ adm init Or (use adm whose version higher or equal than v1.…

2023年信创云管平台选哪家?咨询电话多少?

随着云计算和信创国产化的快速发展,越来越多企业需要支持信创系统的云管平台。但很多企业不知道市面上信创云管平台有哪些,也不知道选哪家?这里我们小编就给大家来回答一下。 2023年信创云管平台选哪家?咨询电话多少?…