《自定义类型:结构体》

1. 结构体回顾

结构体的声明
结构体的初始化
在这里插入图片描述

2. 结构体的特殊声明

匿名结构体: 不需要给结构体名字,但是只能使用一次。
这里的使用一次具体是什么意思呢,刚开始学的时候我自己的理解是有误解的,下面给出一个示例;
在这里插入图片描述
注意:这里的匿名结构体只能使用一次的意思是它只能初始化一次,也就是说只能跟在匿名结构体的后面进行初始化,这就和正常的结构体不同,因为正常的结构体是可以在main函数里面或者结构体外面初始化的,但是并不代表着只能初始化一个,也可以初始化多个。

我们通过上面的示例可以发现匿名结构体不能像正常的结构体那样完成初始化,那没有其他方法对其进行初始化了吗?其实我们通过一些手段是可以对其进行初始化的
看下面这个示例:

在这里插入图片描述
这里我们用到了strcpy函数来将要初始化的内容拷贝到了目的地,也达到了我们想要的目的。

3. 结构体的自引用

在讲结构体的自引用之前我们先回顾一下数组,数组其实就相当于一个顺序表,因为我们如果知道一个元素的地址的话,是可以顺藤摸瓜去找到其他的元素的,
如下图图示:

在这里插入图片描述
我们这里在每一个结构体中存放一个数据,然后在将下一个结构体数据的地址给到第一个结构体,让第一个结构体可以找到下一个结构体,这样就将这些结构体链接起来了。

那么问题来了,我们该怎么编写代码呢?

刚开始我们可能会这样写:
在这里插入图片描述

乍一看是没啥问题,但你仔细一想,这样写合适吗,你知道它会占用多大内存吗?
所以这样写就是不太合适的

修改:
在这里插入图片描述
这里这么改动的话就是指针只会占4/8个字节,这样的话就明确了,不像前面的一个结构体是一个int的字节再加上下一个结构体的空间,你不知道是多大的空间。

实现形式:
在这里插入图片描述

优化:
在这里插入图片描述

这里的结构体自引用最好是好好理解一下,这跟后面要学习的数据结构密切相关,最好是能加深理解。

4. 结构体的内存对齐

(1) 例题1

在这里插入图片描述
输出结果:
在这里插入图片描述
可以看到结果和我们想的并不一样,那么这是为什么呢?我们下面通过对结构体中内存的存储来进行学习
在这里插入图片描述
在这里插入图片描述

例题1解读;

S1:
在这里插入图片描述
S2:
在这里插入图片描述

对比: 我们可以发现即使是相同的成员,占用的内存空间也不相同,为什么呢,
这就和成员的顺序有关了,我们不难发现如果将占内存小的数据集中放在一块的话就可以省下不少的空间。

下面我们来看一个比较特殊,也是一个比较出错的地方—嵌套结构体

(2) 例题2

在这里插入图片描述
解题:
在这里插入图片描述

所以S3就是16个字节

下面来分析S4:

在这里插入图片描述
运行结果:
在这里插入图片描述

(3)为什么存在内存对齐呢?
  1. 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  2. 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要⼀次访问。假设⼀个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用⼀个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。
    总体来说:结构体的内存对齐是拿空间来换取时间的做法。
    如下面图示:

在这里插入图片描述
当对齐时虽然浪费了空间,但只需要读取一次,不对齐时虽然节省了空间,但需要读取两次,一次对齐,一次读取

(4) 计算成员在结构体中的偏移量

在这里插入图片描述
可以发现这里计算出来的偏移量和我们分析的一样,说明我们的分析是正确的。

(5) 修改默认对齐数

我们可以通过#pragma这个头文件来修改默认对齐数
在这里插入图片描述注意: 虽然说设置默认对齐数的时候是任意的,但是考虑到各种类型数据的字节一般都是2的倍数,所以在设置字节的时候最好是偶数。

(6) 结构体传参

方式1:
在这里插入图片描述

方式2:
在这里插入图片描述

对比: 上面的两种方式中,方式1是传值操作,会将所有的数据都传过去,也就导致了在Print1函数中,它还会开辟一个同等大的空间,这样其实就比较浪费空间,而方式2是传址操作,传过去的是结构体的指针,而我们知道指针只会占用4/8个字节,这样的话就比较节省空间,当然这里可能会有同学说指针不安全,我们其实完全可以控制的,在传址时加上一个const 就可以了。

5. 结构体实现位段

(1)什么是位段?

位段的声明和结构是类似的,有两个不同:

  1. 位段的成员必须是 intunsigned intsigned int ,在C99中位段成员的类型也可以
    选择其他类型。
  2. 位段的成员名后边有⼀个冒号和⼀个数字。

示例:
在这里插入图片描述
但要注意的是这里冒号后面的数字的大小指的是比特位

(2)位段的作用

结果:
在这里插入图片描述
这里我们可以体会到位段的作用,它可以通过指定空间,从而更好的节省空间

(3)位段中的内存分配
例题:

在这里插入图片描述
运行结果:
在这里插入图片描述

位段的跨平台问题

在这里插入图片描述

位段使用时的注意事项

在这里插入图片描述
示例:
在这里插入图片描述

正解:
在这里插入图片描述

这个时候可以先定义一个变量,然后输入一个值,再把这个值赋给位段。

总结:

这期里面我们主要讲解了结构体的特殊声明、结构体的自引用、结构体的内存对齐、为什么存在内存对齐、修改默认对齐数、结构体传参、结构体实现位段、什么是位段、位段的作用、位段中的内存分配、位段的跨平台问题、使用位段时的注意事项。

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

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

相关文章

基于Java Springboot城市公交运营管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

【杂谈】无人机测绘技术知识

无人机测绘技术知识 随着科技技术的不断进步和低空经济的快速推进,无人机技术已经从最初的军事侦察、航拍娱乐,逐渐深入到各个行业领域,其中无人机测绘技术(航空摄影测量)更是凭借其高效、精准、灵活的特性&#xff0…

数据挖掘复习

一、绪论 分类 classify 上涨或跌 回归 regression 描述具体数值 分类模型评估 1.混淆(误差)矩阵 confusion matrix 2.ROC曲线 receiver operating characteristic curve 接收者操作特征曲线 3.AUC面积 area under curve ROC曲线下与坐标轴围成的面…

Springboot 整合 Java DL4J 构建股票预测系统

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

ZSTD 内存泄漏问题

优质博文:IT-BLOG-CN Zstandard(简称zstd)是一种无损压缩算法,由Facebook开发并开源。它旨在提供高压缩比和高解压速度的平衡,适用于多种数据压缩需求。 特点 【1】高压缩比: zstd能够在保持较高压缩比的…

嵌入式硬件电子电路设计(五)LDO低压差线性稳压器全面详解

引言: LDO(Low Dropout Regulator,低压差线性稳压器)是一种常用的电源管理组件,用于提供稳定的输出电压,同时允许较小的输入电压与输出电压之间的差值。LDO广泛应用于各种电子设备中,特别是在对…

D3基础:绘制圆形、椭圆形、多边形、线、路径、矩形

在D3.js中&#xff0c;可以通过SVG元素来创建各种几何图形。以下是D3.js中常用的几何图形及其简单的创建方法&#xff1a; 1. 圆形 (Circle) 圆形是最基本的形状之一&#xff0c;可以通过<circle>标签来创建。 <!DOCTYPE html> <html> <head><met…

17.100ASK_T113-PRO 配置QT运行环境(三)

前言 1.打开QT,新建项目. 做成以下效果,会QT都没有问题吧 编译输出: /home/book/LED_and_TempHumi/build-LED_and_TempHumi-100ask-Debug LED_and_TempHumi 2.下载程序与测试 设置运行环境 export QT_QPA_PLATFORMlinuxfb 这个地方还需要加字体,不然不会显示字体.

React 实现网页首页设计

目录 页面分解 项目初始化 项目结构 运行项目 页面分解 页面主要元素&#xff1a; Header&#xff08;导航栏&#xff09; 包含网站 logo 和导航菜单。Hero Section&#xff08;主横幅&#xff09; 大背景图片、标题文字、描述文字。Features Section&#xff08;功能展示…

[Go实战]:SSE消息推送

前言 在现代Web开发中&#xff0c;前后端分离已成为主流趋势。为了实现实时数据推送&#xff0c;Server-Sent Events (SSE) 是一种高效且易于实现的技术。本文将介绍如何在Go语言中实现SSE服务端&#xff0c;并在前端使用JavaScript进行集成&#xff0c;实现一个完整的实时数据…

使用OkHttp进行HTTPS请求的Kotlin实现

OkHttp简介 OkHttp是一个高效的HTTP客户端&#xff0c;它支持同步和异步请求&#xff0c;自动处理重试和失败&#xff0c;支持HTTPS&#xff0c;并且可以轻松地与Kotlin协程集成。OkHttp的设计目标是提供最简洁的API&#xff0c;同时保持高性能和低延迟。 为什么选择OkHttp …

【技术解析】Dolphinscheduler实现MapReduce任务的高效管理

MapReduce是一种编程模型&#xff0c;用于处理和生成大数据集&#xff0c;主要用于大规模数据集&#xff08;TB级数据规模&#xff09;的并行运算。本文详细介绍了Dolphinscheduler在MapReduce任务中的应用&#xff0c;包括GenericOptionsParser与args的区别、hadoop jar命令参…

Linux :进程间通信之管道

一、进程间通信 1.1 是什么和为什么 1、进程间通信是什么&#xff1f;&#xff1f; ——>两个或多个进程实现数据层面的交互&#xff0c;但是由于进程独立性的存在&#xff0c;导致通信的成本比较高。 2、既然通信成本高&#xff0c;那为什么还要通信呢&#xff1f;&…

Vue基础(2)_el和data的两种写法

举例&#xff1a; <div id"root"><h1>你好&#xff0c;{{name}}</h1> </div> el和data的2种写法 1.el有2种写法 (1).new Vue时候配置el属性。 // 第一种写法&#xff1a;new Vue时候配置el属性。// 优点&#xff1a;简单、直接new Vue({e…

【汇编语言】数据处理的两个基本问题(二) —— 解密汇编语言:数据长度与寻址方式的综合应用

文章目录 前言1. 指令要处理的数据有多长&#xff1f;1.1 通过寄存器指明数据的尺寸1.1.1 字操作1.1.2 字节操作 1.2 用操作符X ptr指明内存单元的长度1.2.1 访问字单元1.2.2 访问字节单元1.2.3 为什么要用操作符X ptr指明 1.3 其他方法 2. 寻址方式的综合应用2.1 问题背景&…

c++多态(深度刨析)

C系列-----多态 文章目录 C系列-----多态前言一、多态的概念二、多态的定义及实现2.1、多态构成的条件2.1.1、虚函数2.1.2、虚函数的重写 2.2、C11 override 和 final2.3、重载、覆盖(重写)、隐藏(重定义)的对比2.4、抽象类2.5、 接口继承和实现继承 三、多态的原理3.1、虚函数…

FPGA开发技能(9)快速生成约束XDC文件

文章目录 1.从Cadence导出csv约束文件2.python程序将csv导出为xdc文件。3.python生成exe4.exe使用注意事项5.传送门 前言&#xff1a; 作为一名FPGA工程师&#xff0c;通常公司会对该岗位的人有一定的硬件能力的要求&#xff0c;最基础的就是需要依据原理图的设计进行FPGA工程内…

css uniapp背景图宽度固定高度自适应可以重复

page {height: 100%;background-image: url(https://onlinekc.a.hlidc.cn/uploads/20241115/350f94aaf493d05625a7ddbc86c7804e.png);background-repeat: repeat;background-size: contain;} 如果不要重复 把background-repeat: repeat;替换background-repeat: no-repeat;

Stable Diffusion核心网络结构——U-Net

​ &#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&a…

学习threejs,使用AnimationMixer实现变形动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AnimationMixer 动画…