结构体变量的创建和初始化以及内存对齐

在这里插入图片描述

前言

嗨,我是firdawn,在本章中我们将介绍,结构体变量的创建和初始化,结构成员访问操作符以及结构体的内存对齐,下面是本章的思维导图,接下来,让我们开始今天的学习吧!
在这里插入图片描述

一,结构体类型的声明

1.1 结构体的一般声明

在这里插入图片描述
这里声明的结构体是有名字(Stu)的。

1.2 结构体的特殊声明

在结构体的声明中,有一类特殊的声明为匿名声明,如下图
在这里插入图片描述
这里就可以懒得起名字了,对不对,不过匿名声明有很多缺点,例如:
1.匿名结构体只能使用一次,只能在声明这个结构体的同时创建结构体变量。
2.如下图
在这里插入图片描述
在这里编译器会将两个结构体当成不同的类型,所以这样赋值是非法的。
总结:那么,既然匿名声明有诸多麻烦,编者建议大家尽量少使用匿名声明。

1.3 结构体的自引用

我们在定义结构体时,如果要在结构体成员中包含⼀个类型为该结构本⾝的成员,应该怎么做呢?如图(错误示范),
在这里插入图片描述
在结构体 U 中,成员struct U展开又会包含自己,这样无限循环下去,这个结构体就会无限大。
所以,这样自引用是不行的,那我们应该怎么做呢,才能在结构体中又包含⼀个类型为该结构本⾝的成员,正确答案如下图,其实我们使用指针就可以了。
在这里插入图片描述

二,结构体变量的创建和初始化

2.1 结构体变量的创建

结构体变量的创建有两种方式:
1.在声明结构体的同时创建结构体变量
在这里插入图片描述
2.在使用时,用结构体类型创建结构体变量
在这里插入图片描述

2.2 结构体变量的初始化

在这里插入图片描述

三,结构成员访问操作符

3.1 结构体成员访问操作符有两种,用于访问结构体成员:. 和 ->

  1. 对于结构成员访问操作符 “ . ”,它的操作对象是结构体成员
    在这里插入图片描述

  2. 对于结构成员访问操作符 “ -> ”,它的操作对象是结构体指针
    在这里插入图片描述

四,结构体传参

4.1 传结构体变量

在这里插入图片描述
在这里,调用函数时,传的是变量,为值传递,形参是实参的一份临时拷贝,改变形参不影响实参。

4.2 传结构体地址

在这里插入图片描述

在这里,调用函数时,传的是地址,为址传递,我们可以通过解引用操作来改变结构体变量stu1。

五,结构体内存对齐

5.1 对齐规则

  1. 结构体的第一个成员的起始地址处,默认为偏移量为0的位置,每过一个字节,偏移量加一。
  2. 结构体的每一个成员都需要对齐到成员对齐数的整数倍的偏移量位置处。
    对齐数=成员所占的字节大小与编译器默认的最大对齐数之间的较小值。
  3. 结构体的总大小必须是其内部成员中的最大对齐数的整数倍。
    在这里插入图片描述
    不放数据的空间我用了灰色填充。

5.2 为什么存在内存对齐?

  1. 平台移植原因,某些平台,只能在特定的地址处,取出特定的数据。
  2. 性能原因,如果编译器处理数据时,一次读取8个字节,那么我们储存一个8字节的数据,如果采用了内存对齐规则,编译器只读取一次就可以拿到数据,否则我可能需要读取两次才能拿到数据。。总的来说,这是一种拿空间换时间的做法。
  3. 我们既然已经知道的内存对齐,那么,如果我要尽量减小空间消耗,应该怎么做呢?其实,我们这时候可以尽量将相同数据类型的成员放到一起,这样,就可以节省空间啦。

5.3 修改默认对齐数

我们可以通过使用预处理指令#pragma pack(4),修改最大对齐数为4。

六,结构体实现位段

6.1 什么是位段

位段的声明和结构体是类似的,不过有两个地方不同。

  1. 位段的成员必须是int unsigned int 或者 signed int,不过在C99标准中,位段成员可以上其他的类型。
  2. 位段的成员名后面有一个冒号和一个数字。

6.2 位段的内存分配

位段存储时,编译器分配空间是一个字节一个字节给的,使用空间的时候,一个位段成员所占空间的大小(单位是bit)取决于你定义它时指定给它的空间大小。不过空间是从左向右使用还是从右向左使用,标准是未定义的,取决于具体的编译器,在VS2022中,位段成员的空间使用是从右向左的。

6.3 位段的跨平台问题

  1. int 位段被当成有符号数还是⽆符号数是不确定的。
  2. 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会
    出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
  4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利⽤,这是不确定的。不过在VS2022中是舍弃这块空间。

6.4 位段的应用

由于位段能节省空间的优点,位段可以用于IP数据报的传递,这样就可以减小网络的延迟。
在这里插入图片描述

6.5 位段使用的注意事项

位段的几个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。
所以不能对位段的成员使用&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是输⼊放在⼀个变量中,然后赋值给位段的成员。
在这里插入图片描述

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

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

相关文章

电脑远程控制另一台电脑怎么弄?

可以远程控制另一台电脑吗? “你好,我对远程访问技术不太了解。现在,我希望我的朋友可以远程控制我的Windows 10电脑,以便她能帮我解决一些问题。请问,有没有免费的方法可以实现这种远程控制?我该如何操作…

继“三级淋巴结”之后,再看看“单细胞”如何与AI结合【医学AI|顶刊速递|05-25】

小罗碎碎念 24-05-25文献速递 今天想和大家分享的是肿瘤治疗领域的另一个热点——单细胞技术,我们一起来看看,最新出炉的顶刊,是如何把AI与单细胞结合起来的。 另外,今天是周末,所以会有两篇文章——一篇文献速递&…

【Unitydemo制作】音游制作—模式玩法的实现

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

如何在Spring中配置Bean?

在Spring框架中配置Bean&#xff0c;主要有以下几种方式&#xff1a; XML配置文件注解配置Java配置类 1. XML配置文件 早期的Spring版本广泛使用XML配置文件来定义和配置Bean。在XML中&#xff0c;可以通过 <bean> 标签定义Bean&#xff0c;指定其类、唯一标识符&…

代码随想录算法训练营第十四天(py)| 二叉树 | 递归遍历、迭代遍历、统一迭代

1 理论基础 1.1 二叉树的种类 满二叉树 只有度为0和2的节点&#xff0c;且度为0的节点在同一层。 深度为k&#xff0c;有2^k-1个节点 完全二叉树 除了最底层可能没填满&#xff0c;其余每层节点数都达到最大。并且最底层节点全部集中在左边。 二叉搜索树 是一个有数值…

使用Python将Word文档中的图片提取并生成PowerPoint幻灯片

在这篇博客中&#xff0c;我们将学习如何使用Python将Word文档中的图片提取出来并生成一个PowerPoint幻灯片。我们将借助wxPython、python-docx和python-pptx这三个强大的库来实现这一目标。以下是实现这个功能的完整过程。 C:\pythoncode\new\wordTOppt.py 所需库 首先&…

htb_FormulaX(XSS)

信息收集 常规信息收集 nmap -sV -sC 10.10.11.6开放22&#xff0c;80端口 gobuster dir -u http://10.10.11.6/ -w /usr/share/Seclists-master/Discovery/Web-Content/directory-list-2.3-medium.txt一无所获 80端口-web 注册账户 Chat Now 和 Contact Us是重点 Chat …

台湾省军事演习路径规划:A*算法在复杂地形中的应用

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

【全开源】分类记账小程序系统源码(ThinkPHP+FastAdmin+UniApp)

基于ThinkPHPFastAdminUniAppvk-uView-uiVue3.0开发的一款支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计。 &#xff1a;智能管理您的财务生活 一、引言&#xff1a;财务智能化…

代码的命名规则

单词简写 单词超长的可简写、代码内常见的可简写 方法 均小写&#xff0c;用下划线分割&#xff0c;文件名_动作_属性_子属性_子属性的子属性 例如&#xff1a;uart_open、uart_write、uart_read_remaining、uart_change_baudrate、uart_get_xxx、uart_is_xxx、uart_wait_do…

HTTP 错误 404.3 - Not Found 问题处理

问题描述 HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本&#xff0c;请添加处理程序。如果应下载文件&#xff0c;请添加 MIME 映射。 解决对策

如何网页在线编辑 Office word 文档,并支域功能:创建域/插入域/替换域等

在日常在线办公场景中&#xff0c;我们经常会遇到一些复杂的文档编辑需求&#xff0c;特别是我们经常会遇到一些复杂的数学公式&#xff0c;会用到“域”功能&#xff0c;“域”功能便是一个高级且实用的工具。通过设置域&#xff0c;用户可以实现文档的自动化处理&#xff0c;…

【QT实战】汇总导航

✨Welcome 大家好&#xff0c;欢迎来到瑾芳玉洁的博客&#xff01; &#x1f611;励志开源分享诗和代码&#xff0c;三餐却无汤&#xff0c;顿顿都被噎。 &#x1f62d;有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩&#xff0c;不出意外被敷衍、被唾弃、被埋在了垃圾堆…

捕捉二氧化碳也能赚钱?深入探索CCUS技术与商业前景

引言 随着全球变暖和气候变化的加剧&#xff0c;如何有效减少二氧化碳&#xff08;CO2&#xff09;排放成为各国亟待解决的问题。近日&#xff0c;全球最大的二氧化碳捕集工厂在冰岛正式运营&#xff0c;这一消息引起了广泛关注。本文将深入探讨捕集二氧化碳技术&#xff08;C…

【负载均衡在线OJ项目日记】引入网络库和客户端用户路由功能

目录 引入cpp-httplib库 将编译与运行服务打包 代码 客户端用户路由功能 采用MVC结构进行设计 用户路由功能 路由功能代码 引入cpp-httplib库 对于后端编译与运行模块基本已经设计完成&#xff0c;最后用户是通过网络传递代码等信息&#xff1b;我们就要将这个模块引入…

跟TED演讲学英文:Bring on the learning revolution! by Sir Ken Robinson

Bring on the learning revolution! Link: https://www.ted.com/talks/sir_ken_robinson_bring_on_the_learning_revolution Speaker: Sir Ken Robinson Date: February 2010 文章目录 Bring on the learning revolution!IntroductionVocabularySummaryTranscriptAfterword I…

基于 BERT 对 IMDB 电影评论进行情感分类

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

# AI产品经理的自我修养:既懂用户,更懂技术!

今天上班的时候&#xff0c;发现很多AI社群都在讨论一篇播客《一个顶级AI产品经理的自我修养&#xff0c;对谈光年之外产品负责人Hidecloud》&#xff0c;这篇播客的嘉宾是光年之外的产品负责人——Hidecloud&#xff08;张涛&#xff09;&#xff0c;聊了许多关于他在做AI产品…

MySQL多表关联查询习题

一、素材 -- Active: 1714203732007127.0.0.13306db_stu -- 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); -- 创建…

Springboot中的微服务架构实践

Spring Boot中的微服务架构实践 在本文中&#xff0c;我们将分析微服务架构的关键概念及其在Spring Boot中的应用。然后&#xff0c;我们将演示如何构建微服务并将它们部署到云端或本地服务器。最后&#xff0c;我们将探索使用Spring Cloud和Netflix Eureka进行服务发现和配置…