【C语言】结构体与位段,C语言中的结构体与位段详解

马肤

温馨提示:这篇文章已超过448天没有更新,请注意相关的内容是否还可用!

摘要:本文介绍了C语言中的结构体与位段。结构体是一种可以包含多个不同类型数据项的数据结构,允许用户定义复杂的数据类型。位段则是结构体的一种特殊形式,允许在固定大小的内存空间中存储不同类型的数据项,且每个数据项的大小由其在结构体中的位长度决定。掌握结构体和位段的使用对于C语言编程至关重要,它们为数据存储和管理提供了灵活而高效的方式。

我们之前学习了如何定义整型或浮点型的变量,这些变量用于描述整数或小数,无论是整数还是小数,它们只能描述简单的对象,如果我们想要描述像一本书、一个人这样的复杂对象,就需要使用更高级的数据结构,一本书包含许多信息,如书名、价格、作者和出版日期等。

我们会发现,我们已经学过如何描述其中的一些信息,例如可以使用字符数组来描述书名,使用整型来描述价格,C语言为我们提供了一种自定义类型——结构体,并提供了声明结构体的关键字:struct。

如何正确使用结构体?

1、结构体的使用(声明+创建变量+初始化)

(在这里可以插入第一张图片)

小结:创建变量的同时,给成员赋值的同时,才叫初始化,且可以对全部成员进行赋值;而赋值不可以同时操作结构体的全部成员。

2、匿名结构体

【C语言】结构体与位段,C语言中的结构体与位段详解 第1张

匿名结构体是指没有标签的结构体类型。

(在这里可以插入第二张图片)

【C语言】结构体与位段,C语言中的结构体与位段详解 第2张

小结:由上面的代码截图可知,匿名结构体若不被关键字typedef重定义,则只能使用一次(在声明的同时,也进行变量的创建)。

3、结构体自引用

【C语言】结构体与位段,C语言中的结构体与位段详解 第3张

在声明结构体类型时,是否可以包含一个类型为自身的成员呢?下面我们将对People类型的结构体增加一个成员,用来描述伴侣。

(在这里可以插入第三张图片)

【C语言】结构体与位段,C语言中的结构体与位段详解 第4张

第一个例子类似于我们平常所说的无限套娃——结构体包含结构体,这种做法会导致结构体的内存无限大,无法计算结构体的内存,所以C语言是明令禁止的,第二个例子则是正确的自引用方式——包含自身结构体的指针。

4、结构体的两个操作符

【C语言】结构体与位段,C语言中的结构体与位段详解 第5张

那么我们又该如何逐一去访问该结构体的成员呢?C语言为我们提供了两个操作符:.(点操作符)和->(箭头操作符),当我们知道了结构体的变量的时候,用操作符.(点操作符);当我们知道了指针结构体地址的指针变量的时候,用操作符->(箭头操作符)。

结构体的内存对齐

1、什么是内存对齐?

【C语言】结构体与位段,C语言中的结构体与位段详解 第6张

结构体在内存中占据的字节数并非简单的成员类型大小的标量和,而是存在内存对齐这一规则,结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处;其余的成员对齐到某个数字(对齐数)的整数倍处;该数字是对齐数与该成员变量大小的较小值,不同的平台或编译器默认的对齐数可能不同。

2、为什么存在内存对齐?

【C语言】结构体与位段,C语言中的结构体与位段详解 第7张

平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则可能抛出硬件异常,性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐,原因在于,为了访问未对齐的内存,处理器可能需要两次内存访问;而对齐的内存访问只需要一次访问,内存对齐是牺牲时间换空间的一种做法,某些处理器总是从内存中取固定字节数(如8字节),如果地址不是该字节数的倍数,则可能需要执行两次内存访问来读取或写入值,保证所有double类型数据的地址都对齐到固定字节数的倍数可以确保用一个内存操作来读写值,否则可能会导致性能下降,因此我们需要理解并考虑内存对齐的影响以确保程序的正确性和效率,修改默认对齐数的方法可以参考提供的图片进行理解。 接下来我们再来了解下位段这一概念。 接下来我们再来了解下位段的概念及应用场景。 接下来我们探讨位段的概念及其在实际编程中的应用场景和重要性。 位段是一种特殊的结构体表示方式,其成员类型只能是整型并且后面加上冒号与数字来表示该变量在内存中所占的比特位数,位段的实现是建立在结构体的概念之上的但有一些特定的规则和限制需要注意和理解例如位段的成员没有地址不能直接进行地址操作等位段的内存分配和跨平台问题也需要特别注意和理解不同平台上位段的内存分配可能会有所不同因此需要特别注意跨平台的兼容性问题在进行位段编程时需要特别注意这些细节以确保程序的正确性和可移植性同时位段的使用也需要谨慎以避免潜在的问题和风险总之位段是C语言中一种重要的数据结构它可以帮助我们更高效地存储和处理数据但同时也需要我们注意一些细节和风险以确保程序的正确性和稳定性四、位段的概念及应用场景 位段是一种在C语言中使用的特殊数据结构它允许我们以紧凑的方式存储多个字段其中每个字段都占用固定数量的位而不是固定数量的字节位段的声明类似于结构体但它有一些重要的区别位段的成员类型只能是整型并且每个成员后面都带有冒号和一个数字表示该成员在内存中占用的位数 位段的主要应用场景是节省存储空间特别是在处理大量数据且每个字段占用空间很小的情况下使用位段可以有效地减少内存占用提高程序的运行效率然而需要注意的是位段的实现涉及到很多不确定因素并且是不跨平台的因此在进行跨平台编程时应避免使用位段 位段的声明和初始化与结构体类似但在使用时需要注意一些特殊的


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码