前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言——结构体

C语言——结构体

作者头像
Eternity._
发布2024-06-14 14:39:45
660
发布2024-06-14 14:39:45
举报
文章被收录于专栏:登神长阶登神长阶

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

一.结构体

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. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.结构体
    • 1.1 什么是结构体
      • 1.2 结构体的声明
        • 1.3 特殊的声明
          • 1.4 结构的自引用
            • 1.5 结构体变量的定义和初始化
              • 1.5.1 结构体变量的定义
              • 1.5.2 结构体变量的初始化
              • 1.5.3 结构体变量的嵌套初始化
            • 1.6 结构体内存对齐
              • 1.6.1结构体的对其原则
            • 1.7 修改默认对齐数
              • 1.8 结构体传参
              • 二.位段
                • 2.1什么是位段
                  • 2.2 位段的内存分配
                    • 2.3 位段的跨平台问题
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档