浅析 C 语言的共用体、枚举和位域

前言

最近在尝试阅读一些系统库的源码,但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅,发现是 C 语言中的共用体和位域。于是,趁着课本还没有扔掉,将一些相关的知识点记录在本文。

文章目录

  • 前言
  • 共用体 (union)
  • 枚举 (enum)
  • 位域
  • 参考资料

共用体 (union)

公用体和结构体相似,也是一种数据构造机制。但是结构体中的各成员变量顺序排列存储,每个成员变量都有自己独立存储空间,而共用体中所有成员变量共享同一片内存区域,一个共用体变量在每个时刻里只能保存它的某个成员变量的值

定义格式如下:

union 共用体名 {成员列表
};

下面是共用体和结构体占用内存的情况:

#include <stdio.h>union UnionData {int a;float b;double c;char d;
};struct StructData {int a;float b;double c;char d;
};int main() {printf("%lu %lu\n", sizeof(UnionData), sizeof(StructData));return 0;
}

控制台输出结果:

8 24

在这里插入图片描述
共用体能支持在同一块内存区域对不同的数据类型进交替使用,增加了灵活性,节省了内存,通常在系统库中会有所应用。

枚举 (enum)

枚举 (enumeration) 是一系列命名的整型常量,它是一种基本数据类型,而不是一种构造类型。在“枚举”类型的定义中,我们需要列举出所有可能值,就像列举一周七天、一年四季等。

定义格式如下:

enum 枚举名 {枚举列表};

枚举的使用例子如下:

#include <stdio.h>// 枚举定义
enum Season {SeasonSpring = 1,SeasonSummer,SeasonAutumn, SeasonWinter
};int main () {Season a = SeasonSpring;switch (a) {case SeasonSpring:printf("SeasonSpring\n");break;case SeasonSummer:printf("SeasonSummer\n");break;case SeasonAutumn:printf("SeasonAutumn\n");break;case SeasonWinter:printf("SeasonWinter\n");break;}return 0;
}

控制台输出结果:

1 2 3

位域

有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。

出于节省内存的角度考虑,就有了位域这种设计。位域是 C 语音中一种特殊的结构体成员,它允许我们指定它所占的内存位数

定义格式如下:

struct 位域结构名 {类型说明符 位域名 : 位域长度;
};

说明:

  • 一个位域必须存储在同 1 个字节中,不能跨两个字节。如果一个字节所剩的空间不足以存储下一个位域时,应该从下一个字节开始存储。
  • 位域长度不能大于 1 个字节长度,也就是说不能超过 8 位。
  • 位域的数据类型只能是 int、unsigned int、char、枚举等类型。
  • 位域可以没有位域名,因为无名的位域是不能使用的,所以只是用作填充或调整位置的作用。例如:
    struct BitStruct {int a : 4;int   : 2;  // 空域,不能使用int b : 4;int c : 4;
    }
    

参考资料

  • https://www.runoob.com/cprogramming/c-bit-fields.html
  • https://book.douban.com/subject/26792521/

本文主要对 C 语言中,共用体、枚举和位域等三块内容做简单介绍,涉及到他们在工程中应用的方面很少,如果后面阅读系统源码的过程遇到了,会再做进一步补充。

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

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

相关文章

MySQL建表和增添改查

1.创建一个名为mydb的数据库 mysql> show database mydb; 查询 mysql> show database mydb; 2.创建一个学生信息表 mysql> create table mydb.student_informtion( -> student_id int UNSIGNED NOT NULL PRIMARY KEY, //非空&#xff08;不允许为空&#xff0…

图像 检测 - DETR: End-to-End Object Detection with Transformers (arXiv 2020)

图像 检测 - DETR: End-to-End Object Detection with Transformers - 端到端目标检测的Transformers&#xff08;arXiv 2020&#xff09; 摘要1. 引言2. 相关工作2.1 集预测2.2 Transformers和并行解码2.3 目标检测 3. DETR模型References 声明&#xff1a;此翻译仅为个人学习…

【数学】3、动态规划

文章目录 一、原理1.1 如何想到dp 二、案例2.1 编辑距离2.1.1 状态转移2.1.2 状态转移方程和编程实现 2.2 钱币组合 一、原理 接着文本搜索的话题&#xff0c;来聊聊查询推荐&#xff08;Query Suggestion&#xff09;的实现过程&#xff0c;以及它所使用的数学思想&#xff0…

【Java】Springboot脚手架生成初始化项目代码

Springboot配置生成初始化项目代码可以通过mvn的mvn archetype:generate 和阿里云原生应用脚手架&#xff08;地址&#xff09;、spring官方提供的start初始化生成页面(地址&#xff09;。 1、mvn archetype:generate 通过mvn选择对应的脚手架可以快速生成初始化代码&#xf…

LangChain+ChatGLM整合LLaMa模型(二)

开源大模型语言LLaMa LLaMa模型GitHub地址添加LLaMa模型配置启用LLaMa模型 LangChainChatGLM大模型应用落地实践&#xff08;一&#xff09; LLaMa模型GitHub地址 git lfs clone https://huggingface.co/huggyllama/llama-7b添加LLaMa模型配置 在Langchain-ChatGLM/configs/m…

无涯教程-Lua - 调试语句

Lua提供了一个调试库&#xff0c;该库提供了所有原始函数供无涯教程创建自己的调试器。即使没有内置的Lua调试器&#xff0c;也有许多针对Lua的调试器&#xff0c;这些调试器由各种开发人员创建&#xff0c;其中许多开源。 下表列出了Lua调试库中可用的函数及其用法。 Sr.No.…

Gogs Git windos服务搭建指南

Gogs Git服务器搭建指南 背景&#xff1a; 近期在Linux 麒麟 v10 系统上开发&#xff1b;为了团队协同编程&#xff1b;选用了Git服务器&#xff1b;之前在windos开始时候使用的visualSVN server; visualSVN server从4.x.x.x开始收费&#xff1b;限制15个开发者用户&#xff…

【100天精通python】Day23:正则表达式,基本语法与re模块详解示例

目录 专栏导读 1 正则表达式概述 2 正则表达式语法 2.1 正则表达式语法元素 2.2 正则表达式的分组操作 3 re 模块详解与示例 4 正则表达式修饰符 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12375510.html 1 正则表达式概述 python 的…

MySQL系统数据库及常用工具指令介绍

文章目录 1.系统数据库2.常用工具2.1 -e指令2.2 mysqladmin指令2.3 mysqlbinlog指令2.4 mysqlshow指令2.5 mysqldump指令 数据备份2.6 mysqlimport/source 指令 数据导入 3.指令小结 1.系统数据库 2.常用工具 2.1 -e指令 不用登陆mysql直接执行脚本命令 mysql -h192.168.200.…

如何使用大模型处理生活繁琐的工作

如果每封电子邮件、每个带有订单、发票、投诉、录用请求或工作申请的 PDF 都可以翻译成机器可读的数据&#xff0c;会怎样&#xff1f;然后可以由 ERP / CRM / LMS / TMS 自动处理吗&#xff1f;无需编程特殊接口。 听起来很神奇&#xff1f;它确实有一些魔力。但最近已成为可…

Xposed框架开发

文章目录 xpose插件开发步骤清单文件新建一个类&#xff08;插件入口点&#xff09;设置入口点 Hook第一个实例zhuceji.apk一些常用的HOOKHookH5PluginHookProxyPluginHookSystem 资料Xposed原理初探 xpose插件开发步骤 magisk安装与配置 Xpose Framework API LSPosed magisk …

02_kafka_基本概念_基础架构

文章目录 常见的消息队列工作模式基本概念kafka 特性Kafka 基本架构topic 分区的 目的/ 好处 日志存储形式消费者&#xff0c;消费方式 逻辑消费组 高性能写入&#xff1a; 顺序写 mmap读取&#xff1a;零拷贝DMA 使用场景 常见的消息队列工作模式 至多一次&#xff1a;消息被…