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

在这里插入图片描述

前言

嗨,我是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直接给位段的成员输⼊值,只能是输⼊放在⼀个变量中,然后赋值给位段的成员。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载CentOS系统或者下载Ubuntu系统去哪下?

因为Centos官网是挂在国外的服务器上,下载镜像时相比于国内的下载速度会慢很多,分享国内的镜像站去阿里巴巴下载Centos镜像。 首先分享两种下载方式,如果只想下载Centos那么就访问方式一的下载地址即可,如果还想下载其他的系统&a…

AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践

系列篇章💥 AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践 目录 系列篇章💥前言一、何为Open Interpreter?二、与 ChatGPT 的代码解释器比较三、 Open Interpreter的特性1、强大的本地计算能力2、丰富的功能3、高度的…

基于springboot+vue的招聘信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

生产物流智能优化系统

对生产调度、物流调度【车辆路径问题、配送中心拣选问题】智能优化算法研究形成系统性程序,逐步开发设计一个智能优化系统【包括:问题说明、实验界面、算法结构和算法程序应用说明】, 当前完成TSP和集送车辆路径的算法程序,程序效…

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发,确定业务目的和目标,将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果,通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…

Java进阶学习笔记8——单继承、Object类、方法重写

Java 是单继承的,Java中的类不支持多继承,但是支持多层继承。 Object类是所有类的父类。 Java不支持多类继承: Java支持多层继承: 反证法: Object类: Object类是java所有类的祖宗类,我们写的任…

Excel中Lookup函数

#Excel查找函数最常用的是Vlookup,而且是经常用其精确查找。Lookup函数的强大之处在于其“二分法”的原理。 LOOKUP(查找值,查找区域(Vector/Array),[返回结果区域]) 为什么查找区域必须升序/…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题:大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务,但我是部署在自己的家庭nas-极空间z4pro里的,属于内网环境。 另外我有一台阿里云服务器,做跳板机。 我有一个阿里的域名…

跟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…

基于DdddOcr通用验证码离线本地识别SDK搭建个人云打码接口Api

前言 最近介绍了一款免费的验证码识别网站,识别效率太低,考虑到ddddocr是开源的,决定搭建搭建一个,发现原作者sml2h3已经推出好久了,但是网上没有宝塔安装的教程,于是本次通过宝塔搭建属于自己的带带弟弟OCR通用验证码离线本地识别 原项目地址:https://github.com/sml2…

Project Reactor 响应式编程

Project Reactor 响应式编程 什么是响应式编程 响应式编程(Reactive Programming)是一种编程范式,致力于处理异步数据流和变化。它的核心思想是构建响应于变化的系统,即当数据流或事件发生变化时,系统能够自动地调整…

【研发日记】【策划向】(一)游戏策划其实就是一道加减法题

文章目录 序设计的过程其实是控制自己欲望的过程我海纳百川,你要不要看看?我跟别人不一样!我的人设就是没有人设,或者说任何人设都是我的人设 记 序 不知不觉进入这个行业几年了,也经历了独立开发和团队开发的过程。在…

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…

【Spring】SSM介绍_SSM整合

1、SSM介绍 1.1简介 SSM(Spring SpringMVC MyBatis)整合是一种流行的Java Web应用程序框架组合,它将Spring框架的核心特性、SpringMVC作为Web层框架和MyBatis作为数据访问层框架结合在一起。这种整合方式提供了从数据访问到业务逻辑处理再…

【Text2SQL】WikiSQL 数据集与 Seq2SQL 模型

论文:Seq2SQL: Generating Structured Queries from Natural Language using Reinforcement Learning ⭐⭐⭐⭐⭐ ICLR 2018 Dataset: github.com/salesforce/WikiSQL Code:Seq2SQL 模型实现 一、论文速读 本文提出了 Text2SQL 方向的一个经典数据集 —…

Aligned Layer:trustless应用的通用验证层

1. 引言 Aligned Layer近期获得了2000万美金的A轮融资,Aligned Layer: 致力于成为 去中心化 zero-knowledge (ZK) proof 验证层。旨在为不同证明系统,提供快速、经济且可扩展的零知识证明验证。作为以太坊生态系统及其他生态系统的通用sour…

【pyspark速成专家】4_Spark之RDD编程2

目录 四,常用PairRDD的转换操作 五,缓存操作 四,常用PairRDD的转换操作 PairRDD指的是数据为长度为2的tuple类似(k,v)结构的数据类型的RDD,其每个数据的第一个元素被当做key,第二个元素被当做value. reduceByKey #reduceByKey…

罗德里格斯公式(旋转矩阵)推导

文章目录 1. 推导2. 性质3. 参考 1. 推导 r r r为旋转轴, θ \theta θ为旋转角度。 先将旋转轴单位化 u r ∣ ∣ r ∣ ∣ u\frac{r}{||r||} u∣∣r∣∣r​ 旋转可以被分为垂直和旋转两个方向, 我们求沿轴方向的分量其实就是在求 p p p向量在 u u u方…

02-Linux【基础篇】

一、Linux的目录结构 1.基本介绍 Linux的文件系统采用层级式的树状目录结构,在此结构中的最上层是根目录"/",然后在此目录下再创建其他的目录 深刻理解Linux树状文件目录是非常重要的 记住一句经典的话:在Linux世界里&#xff…