c语言结构体知识系统详解

news2024/9/23 9:36:23

本篇文章带来结构体相关知识与结构体内存对齐的规则详细讲解!

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!!

一.认识什么是结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
这里和数组进行区分,数组:是一组 相同类型元素的集合;

二.结构体的声明

 如:

tag                  是 结构体标签名 ,是可以自定义的;
member-list    是 成员列表
variable-list     是 变量列表
需要注意的是:后面的分号不能丢;

 这里的 :

  struct   Stu          是结构体类型;

  char  name[ 20] , int age  ,char sex[5]   都是成员变量

  S1, S2, S3            是结构体变量

有两种方式创建结构体变量;

第一种:就是先进行结构体申明后,再创建结构体变量 (是全局变量) 如图左边;

第二种:在进行结构体申明是就直接在括号后面进行结构体创建(是局部变量)  如图右边;

特殊的结构体申明

注意:匿名结构体类型(不完全的声明),创建结构体变量时,只能用上面的第一种方式;(如图)

 上面的两个结构在声明的时候省略掉了结构体标签(tag);

那么,问题来了,上面代码中的   p=&S  时合法的吗?

警告:
编译器会把上面的两个声明当成完全不同的两个类型。
所以是非法的。

结构体类型重命名

如下代码:

 上面代码:将结构体类型 struct  Stu  重命名为Stu;

也可以将匿名结构体类型重命名,如下面代码:

 因此创建结构体变量时,就可以直接用 Stu   S1,S2,S3这种方式创建;

三.结构体的自引用

在结构中包含一个类型为该结构本身的成员是否可以呢?
结构体中包含一个结构体(自身或则另一个结构体),需要用到结构体指针;
如下代码:

匿名结构体自引用时的常见错误: 

四.结构体变量的初始化

注意:

不使用点操作符,只能按照声明时成员列表的顺序进行初始化,使用点操作符可以改变初始的顺序

结构体嵌套结构体的初始化和打印

结构体是用大括号括起来的,所以当一个结构体里面含另一个结构体时,里面的结构体也需要用大括号;

打印上面结构体里面的数据:例如打印Sn2的数据

五.结构体内存对齐(重中之重)

重点:

特别热门的考点:    结构体内存对齐
考察方式:                计算结构体的大小

例:

但是实际运行的结果是:

这是为什么呢?这就讲到结构体的对齐规则了;

结构体的对齐规则:

  1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
Linux中没有默认对齐数,对齐数就是成员自身的大小
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。  
再将上述代码进行分析:

宏offsetof

1.是用来计算结构体成员相较于结构体起始位置的偏移量;
2.offsetof需要包含的头文件是:stddef.h
我们用这个宏来验证我们的分析:
运行的 结果和上面我们分析对照可以发现是一样的;

结构体嵌套结构体的例子

打印来验证我们的分析:

 为什么存在内存对齐?

1. 平台原因 ( 移植原因 )
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特 定类型的数据,否则抛出硬件异常。
2. 性能原因
数据结构 ( 尤其是栈 ) 应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
问。
总体来说:
结构体的内存对齐是拿空间来换取时间的做法。
那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:
让占用空间小的成员尽量集中在一起;

修改默认对齐数

#pragma 这个预处理指令,可以改变我们的默认对齐数。
示例:

 结论:

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

五.结构体传参

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

 上面的 print1 和 print2 函数哪个好些?

答案是:首选print2函数
原因:
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的
下降。
结论:
结构体传参的时候,要传结构体的地址。
本章完~

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

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

相关文章

广州华锐互动:水利数字孪生智能管理系统的特色

水利数字孪生智能管理系统是一种基于数字孪生的新型水利管理工具,它通过将现实世界中的水利设施和设备数字化,并在虚拟环境中进行模拟和分析,为水利管理者提供更加直观、精准的决策支持。该系统具有以下亮点: 首先,水利…

你有英语成绩或证书吗?申请中国人民大学与加拿大女王大学金融硕士是否需要英语?

随着经济全球化的发展,英语的重要性也愈发明显。英语作为世界通用程度较高的语言,在传播本国文化及国际交往中起着不可替代的作用。中国综合国力的巨大提升,让世界开始认真倾听来自中国的声音。这样的现实背景之下,我们强调中国文…

Python(四十五)二层循环中的break和continue

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

HBase Compaction 原理与线上调优实践

作者:vivo 互联网存储技术团队- Hang Zhengbo 本文对 HBase Compaction 的原理、流程以及限流的策略进行了详细的介绍,列举了几个线上进行调优的案例,最后对 Compaction 的相关参数进行了总结。 一、Compaction 介绍 HBase 是基于一种 LSM-…

数据结构:手撕图解七大排序(含动图演示)

文章目录 插入排序直接插入排序希尔排序 选择排序选择排序堆排序 交换排序冒泡排序快速排序hoare版挖坑法前后指针法快速排序的递归展开图快速排序的优化三数取中法 快速排序的非递归实现 归并排序 插入排序 插入排序分为直接插入排序和希尔排序,其中希尔排序是很值…

python面试题(一)

如果无聊,可以查看这篇文章~ 使用python做一些奇奇怪怪的事情?_什么时候才能变强的博客-CSDN博客https://blog.csdn.net/qq_17496235/article/details/131906360 问:什么是Python的GIL(全局解释器锁)?它对…

如何以毫秒精度,查看系统时间以及文件的创建时间

用 cmd 查看系统的时间: powershell -command "(Get-Date -UFormat %Y-%m-%d %H:%M:%S).toString() . ((Get-Date).millisecond)" 用 XYplorer 查看文件的精确创建时间(含30天试用): XYplorer - File Manager for …

基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量(解析法) 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

系统学习Linux-MySQL用户权限管理(三)

一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面,它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和数据库结构,确保只有被授权的用户才可以操作和使用数据库,防止数据被修改…

Qt之切换语言的方法(传统数组法与Qt语言家)

http://t.csdn.cn/BVigB 传统数组法: 定义一个字符串二维数组, QString weekStr[2][7] {"星期一","星期二","星期三","星期四","星期五","星期六","星期日",\ "Monday&…

2023级中国社科院美国杜兰大学中外合作办学双证能源管理硕士

2023级中国社科院美国杜兰大学中外合作办学双证能源管理硕士 作为国内首个且唯一侧重能源金融交易的硕士项目,中国社会科学院大学与美国杜兰大学合作举办的能源管理硕士(Master of Management in Energy)项目旨在培养具备国际视野的高级能源…

基于XDMA 中断模式的 PCIE3.0 QT上位机与FPGA数据交互架构 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案图像产生、发送、缓存数据处理XDMA简介XDMA中断模式图像读取、输出、显示QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 PCIE(PCI Express&#…

权威认可丨九州未来获科学技术成果登记证书

近日,由九州未来自主研发的工业项目——“5G”边缘计算云平台的产品研究及其在工业视觉AI设计中的应用,经评审、公示获准登记,取得浙江省科技厅颁发的科学技术成果登记证书。 伴随我国在新基建领域不断推进深入,5G以其特有的大带宽…

Vue教程(三):计算属性

1、姓名案例—插值语法版 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>姓名案例-插值语法版</title><script type"text/javascript" src"../js/vue.js"><…

IDEA中文UT方法执行报错问题、wps默认保存格式

wps默认保存格式、IDEA中文UT方法执行报错问题 背景 1、wps修改文件后&#xff0c;编码格式从UTF-8-bom变成UTF-8&#xff08;notepad可以查看&#xff09;&#xff1b; 2、IDEA中文UT执行报错&#xff1a; 解决方案 1、语言设置中不要勾选 “Beta版。。。。” 2、cmd中执…

Vue-cli3项目之Vue.config.js配置文件—取代vue-cli2中build与config

我们在做vue项目的时候&#xff0c;在根目录中肯定都看到过一个vue.config.js文件&#xff0c;那么这个文件在整个项目中到底有什么作用呢&#xff1f;本文就来说说使用Vue-cli3 创建的vue项目中&#xff0c;Vue.config.js文件的配置问题。 说点题外话&#xff0c;先来看看vue-…

隐藏文件夹怎么显示?3种方法轻松解决!

“我有些文件不知道为什么就看不到了&#xff0c;不知道是因为我不小心将它们隐藏了还是删除了。有家人知道隐藏文件怎么显示的吗&#xff1f;非常着急&#xff0c;感谢回答&#xff01;” 为了保护我们的隐私&#xff0c;有些重要的文件我们不想将其被人看到&#xff0c;一个…

2017年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

2017年1月真题 四、写作&#xff1a;第56~57小题&#xff0c;共65 分。其中论证有效性分析30 分&#xff0c;论说文35分。 56、论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对论证的有…

【启扬方案】嵌入式核心板在全自动生化仪设备中的应用

随着科技的不断进步和医疗技术的发展&#xff0c;全自动生化分析仪作为体外诊断领域的重要工具之一&#xff0c;逐渐受到广泛的关注。全自动生化分析仪作为一种能够实时监测和分析体液中生化指标的设备&#xff0c;在临床医学应用中的用途广泛&#xff0c;可用于检测血液中的血…

Nim游戏博弈论

【模板】nim 游戏 题目描述 https://www.luogu.com.cn/problem/P2197 甲&#xff0c;乙两个人玩 nim 取石子游戏。 nim 游戏的规则是这样的&#xff1a;地上有 n n n 堆石子&#xff08;每堆石子数量小于 1 0 4 10^4 104&#xff09;&#xff0c;每人每次可从任意一堆石子…