【C语言初阶】C语言结构体深度解析:构建复杂数据类型的基石

前言:每个人的人生中,可能都有那样一些话,如暗夜明灯、海上灯塔,给人以温暖和支撑、希望和力量。念起它们的时候,能感到一种被理解的妥帖,会生出一股被激励的能量,然后,我们得以在鼓舞中走得更远。让我们走进结构体

一.结构体

1.1 什么是结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构体的声明

在这里插入图片描述
例如用结构体描述一个学生
在这里插入图片描述

1.3 特殊的声明

在声明结构体时,可以不完全声明,也就是匿名结构体类型
在这里插入图片描述

1.4 结构的自引用

结构的自引用就是自己作为自己的成员变量
但是要注意正确的引用方法

在这里插入图片描述
如果这样引用结构体的大小将会是无穷大
所以我们引入指针
在这里插入图片描述
这样才能达到自引用的目的

1.5 结构体变量的定义和初始化

1.5.1 结构体变量的定义

在这里插入图片描述

1.5.2 结构体变量的初始化

在这里插入图片描述

1.5.3 结构体变量的嵌套初始化

在这里插入图片描述

1.6 结构体内存对齐

来计算一下结构体的大小

在这里插入图片描述

来计算一下结构体的大小如果不了解的话可能会觉得是
6 6 13

在这里插入图片描述

为什么最终结果会是这样呢?
这就要掌握首先得掌握结构体的对其原则

1.6.1结构体的对其原则

一.
在这里插入图片描述
在这里插入图片描述

二.结构体嵌套问题
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么存在内存对齐?
大部分的参考资料都是如是说的:

  1. 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  2. 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
    原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
    问。

结构体的内存对齐是拿空间来换取时间的做法。

1.7 修改默认对齐数

在这里插入图片描述
在这里插入图片描述

结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。

1.8 结构体传参

结构体传参有两种,传值调用和传址调用

在这里插入图片描述
两种方法都是可行的,但是也有区别

函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

因此结构体传参的时候,要传结构体的地址。

二.位段

2.1什么是位段

在这里插入图片描述
在这里插入图片描述

让我们来思考一下位段A的大小

在这里插入图片描述

我们来跟深入的了解一下位段的内存分配

2.2 位段的内存分配

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

所以跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

三.感谢大家支持

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值