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

这篇具有很好参考价值的文章主要介绍了c语言结构体知识系统详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

c语言结构体知识系统详解,C语言,c语言,开发语言

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

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

目录

​编辑

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

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

一.认识什么是结构体

二.结构体的声明

特殊的结构体申明

​编辑

结构体类型重命名

三.结构体的自引用

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

四.结构体变量的初始化

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

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

重点:

结构体的对齐规则:

宏offsetof

结构体嵌套结构体的例子

 为什么存在内存对齐?

修改默认对齐数

五.结构体传参


一.认识什么是结构体

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

二.结构体的声明

 如:

c语言结构体知识系统详解,C语言,c语言,开发语言

tag                  是 结构体标签名 ,是可以自定义的;
member-list    是 成员列表
variable-list     是 变量列表
需要注意的是:后面的分号不能丢;
c语言结构体知识系统详解,C语言,c语言,开发语言

 这里的 :

  struct   Stu          是结构体类型;

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

  S1, S2, S3            是结构体变量

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

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

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

特殊的结构体申明

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

c语言结构体知识系统详解,C语言,c语言,开发语言

c语言结构体知识系统详解,C语言,c语言,开发语言

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

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

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

结构体类型重命名

如下代码:

c语言结构体知识系统详解,C语言,c语言,开发语言

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

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

c语言结构体知识系统详解,C语言,c语言,开发语言

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

三.结构体的自引用

在结构中包含一个类型为该结构本身的成员是否可以呢?
结构体中包含一个结构体(自身或则另一个结构体),需要用到结构体指针;
如下代码:
c语言结构体知识系统详解,C语言,c语言,开发语言

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

c语言结构体知识系统详解,C语言,c语言,开发语言

四.结构体变量的初始化

c语言结构体知识系统详解,C语言,c语言,开发语言

注意:

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

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

c语言结构体知识系统详解,C语言,c语言,开发语言

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

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

c语言结构体知识系统详解,C语言,c语言,开发语言

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

重点:

特别热门的考点:    结构体内存对齐
考察方式:                计算结构体的大小
例:
c语言结构体知识系统详解,C语言,c语言,开发语言

但是实际运行的结果是:

c语言结构体知识系统详解,C语言,c语言,开发语言

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

结构体的对齐规则:

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

宏offsetof

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

结构体嵌套结构体的例子

c语言结构体知识系统详解,C语言,c语言,开发语言
打印来验证我们的分析:
c语言结构体知识系统详解,C语言,c语言,开发语言

 为什么存在内存对齐?

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

修改默认对齐数

#pragma 这个预处理指令,可以改变我们的默认对齐数。
示例:
c语言结构体知识系统详解,C语言,c语言,开发语言

 结论:

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

五.结构体传参

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

c语言结构体知识系统详解,C语言,c语言,开发语言

 上面的 print1 和 print2 函数哪个好些? 文章来源地址https://www.toymoban.com/news/detail-612242.html

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

到了这里,关于c语言结构体知识系统详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySql003——SQL(结构化查询语言)基础知识

    DB:数据库(Database) 即存储数据的“仓库”,其本质是一个 文件系统 。它保存了一系列有组织的数据。 DBMS:数据库管理系统(Database Management System) 是一种操纵和管理数据库的 大型软件 (例如我们前面下载的MySQL软件),用于建立、使用和维护数据库,对数据库进行统一

    2024年02月15日
    浏览(48)
  • c语言位段知识详解

      本篇文章带来 位段 相关知识详细讲解! 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!! 目录 一.什么是位段 二.位段的内存分配  位段的好处 三.位段的跨平台问题 四.位段的应用 位段的声明

    2024年02月15日
    浏览(38)
  • 【初始C语言8】详细讲解初阶结构体的知识

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖         在上一章中,我们浅浅地学习了初阶指针的相

    2024年02月08日
    浏览(43)
  • c语言基础知识帮助理解(详解数组)

    前面梳理完函数和递归的知识后,来进行数组知识的梳理 对函数有疑惑的同学,可以看我之前的文章:c语言基础知识帮助理解(详解函数)_总之就是非常唔姆的博客-CSDN博客  c语言基础知识帮助理解(函数递归详解)_总之就是非常唔姆的博客-CSDN博客 想做点游戏的同学可以

    2024年02月14日
    浏览(39)
  • c语言基础知识帮助理解(详解函数)

    目录 1. 函数是什么 2. 库函数  3. 自定义函数  4. 函数参数  4.1实际参数(实参)  4.2形式参数(形参)  5.函数的调用 5.1传值调用 5.2传址调用 (传递地址) 6. 函数的嵌套调用和链式访问  6.1 嵌套调用  6.2 链式访问  7. 函数的声明和定义  7.1 函数声明  7.2函数定义 函数是

    2024年02月14日
    浏览(44)
  • 【详解】C语言冷门知识点之--位段

    下面是维基百科对位段的解释:   位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的好处: 可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重

    2024年02月16日
    浏览(41)
  • 【数据结构】C语言结构体详解

    目录 前言 一、结构体的定义 二、定义结构体变量 三、结构体变量的初始化 四、使用typedef声明新数据类型名 五、指向结构体变量的指针 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转

    2024年02月04日
    浏览(49)
  • 微信小程序开发知识结构体系大全/图解(2022)

    请通读全文、切勿随机阅读、以便快速掌握 1、代码放大: 2、代码缩小: 3、选择页面内容: 1、查找页面内容所在文件: 先使用选择工具选择页面内容 再打开控制台一栏右边AppData 先使用选择工具选择页面内容 再查看左边底部页面路径 1、网页(骨架):index.wxml 2、脚本(

    2024年02月04日
    浏览(46)
  • c语言基础知识帮助理解(函数递归详解)

    \\\"从前有座山,山里有座庙,庙里有个老和尚和一个小和尚。有一天老和尚对小和尚说:“从前有座山.山里有座庙,庙里有个老和尚和一个小和尚,有一天老和尚对小和尚说:“从前有座山.山里有座庙,庙里有个老和尚和一个小和尚......\\\" (虽能体现递归特点,但又不是递归)

    2024年02月14日
    浏览(39)
  • 【c语言】详解结构体

    在学习每个类型之前我们需要了解其存在的意义,即 什么是结构体 ? 为什么要引入结构体这个类型呢 ? 我们可以想象现实中我们是如何处理一个人信息的?假设现在要汇总每个同学的个人信息,这时我们会对每个人的姓名,年龄等信息单独建表吗?显然不会,通常会给每

    2024年02月07日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包