当前位置: 首页 > news >正文

结构体structure、共用体union

目录

结构体

结构体类型的定义形式

结构体类型的大小

内存计算例子

共用体union

 用共用体判断大小端

结构体和共用体对比

qsort()


结构体

结构体类型——用来描述复杂数据的一种数据类型

构造类型(用户自定义类型)

struct 结构体类型名

{

        成员列表;

};

struct关键字:表明是在构造一个结构体的类型

结构体名:用来描述结构体这个类型的一个名称

成员列表:表示要描述的复杂数据中用到的具体的成员变量

        定义的方式与之前变量的方式相同

        多个成员变量之间用分号隔开

最后有一个分号表示结束

struct student
{char name[30]; int sno;float score;char sex; 
};//表示定义出一个数据类型

有数据类型,可以:定义变量、指针变量、数组

结构体使用方法

自己构造出这个结构体类型

有了类型——定义变量、数组、指针

结构体类型的指针——做函数形参、做函数返回值

  • 结构体类型的使用过程

先定义出类型

定义变量

  • 定义变量

struct 结构体名 变量名;

  • 结构体初始化

struct student s = {};

看每个成员变量具体是什么数据类型

根据每个成员变量自身的数据类型进行初始化

初始化顺序:按照定义的顺序,依次初始化

struct student s = {666,"jack",1,90.4};
  • 结构体变量的引用

结构体数据引用时一般是引用到具体的数据

运算符   .     (结构体成员运算符)

结构体变量名.成员变量名(访问某个结构体的成员)

s.sno引用s中的sno

结构体类型的数组

struct student s[3];

 -> 指向结构体成员运算符

结构体指针->成员名

结构体类型的定义形式

形式1:先定义类型,然后定义变量

struct demo

{};

struct demo d;

形式2:定义类型的同时定义变量

struct demo

{

} d;

形式3:定义类型的同时定义变量,可以省略结构体名

(结构体类型只用一次)

struct

{

} d;

结构体类型的大小

内存对齐

结构体的对齐规则:内存地址的对齐

1.在32位的平台上,默认都是按4字节对齐的

2.对于成员变量各自在自己的自然边界上对齐
char——1字节
short ——2字节
int——4字节
3.如果:成员变量中有比4字节大,
此时整个结构体 按照4字节对齐。
4.如果:成员变量中没有有比4字节大。此时 整个结构体 按照最大的那个成员对齐

32位的平台
如果有超过4字节,按照4字节对齐。如果没有超过4字节的,则按成员变量中最大对齐

64位的平台
如果有超过4字节,按照超过的最大的成员对齐。如果没有超过4字节的,则按成员变量中最大对齐

同类型的结构体变量之间可以相互赋值

struct student s1;

struct student s2;

s2 = s1;

结构体类型的大小计算

内存对齐是指将数据存储在特定的地址上,以便硬件能够更高效地访问这些数据。不同的数据类型(例如intcharfloat等)通常有不同的对齐要求,这些要求通常与数据类型的大小相关。例如:

  • char类型的数据通常要求对齐到1字节的边界。
  • int类型的数据通常要求对齐到4字节的边界。
  • double类型的数据通常要求对齐到8字节的边界。

内存对齐规则

  1. 基础对齐原则:结构体中的每个成员都必须按照其数据类型的对齐要求对齐。比如,如果一个结构体包含一个int,那么这个int成员必须出现在一个4字节对齐的地址上。

  2. 结构体对齐规则:结构体的总大小必须是其最大成员对齐要求的整数倍。例如,如果一个结构体中最大的成员是double(8字节对齐),那么结构体的总大小也必须是8的倍数,即使可能会存在一些“填充字节”(padding bytes)。

为什么要内存对齐(提高效率)

内存对齐的主要目的是提高访问内存的效率。在现代计算机中,CPU通常是按块(比如4字节或8字节)从内存中读取数据的。如果数据是对齐的,CPU可以一次性读取整块数据,这样效率更高。

如果数据未对齐,CPU可能需要进行多次内存访问才能读取完整的数据,或者需要进行额外的计算来调整地址,这会导致性能下降。

内存计算例子

在这个结构体 demo1 中,有一个整数成员 int i 和一个匿名 union,该 union 包含以下三个成员:

  1. char s[7]:一个长度为7的字符数组,占用7个字节。
  2. int v:一个整数,占用4个字节。
  3. float f:一个浮点数,占用4个字节。

结构体的内存计算

  1. 匿名 union 的大小

    • union 的大小由其最大的成员决定。
    • char s[7] 占用7个字节。
    • int v 占用4个字节。
    • float f 占用4个字节。 因此,union 的大小为7字节(char s[7] 是最大的成员)。
  2. 结构体的对齐要求

    • int i 需要4字节对齐。
    • union 的最大成员 char s[7],虽然它本身是7个字节,但由于int vfloat f可能会让整个结构体具有更严格的对齐要求,假设intfloat都需要4字节对齐,整个 union 的大小可能会被填充到8个字节。
  3. 计算总大小

    • int i 占用4字节。
    • union 占用8字节(对齐到4字节的倍数)。
    • 因此,整个结构体 demo1 的大小为4(int i) + 8(union) = 12字节。

共用体union

语法

union 共用体名

{

成员变量;

};

union demo

{

char a;

short b;

int c;

};

共用体:共用一块内存空间(最大成员的空间)

共用体初始化时只能给一个值,且默认给到第一个成员

共用体变量中的值,取决于最后一次给的值,还要看能影响几个值

 用共用体判断大小端

24a325dcb97749908a8a5645fed99aac.png

在这个代码片段中,union 中有两个成员:

  • int a:通常占用4个字节
  • char b:占用1个字节

由于 union 中所有成员共享同一块内存,因此 union 的大小由其最大的成员决定。在这个例子中,int aunion 中最大的成员,占用4个字节。因此,这个 union 的大小是 4字节

isLittleEndian 函数

  • 该函数用于检查系统的字节序(大端或小端)
  • union 初始化时,将 int a 设为 1(假设int为4字节,即 0x00000001
  • 然后,通过 char b 访问 union 的第一个字节:
    • 如果系统是小端序(little-endian),char b 将读取 0x01,函数返回 1
    • 如果系统是大端序(big-endian),char b 将读取 0x00,函数返回 0

结构体和共用体对比

结构体中各个成员拥有自己独立的空间

共用体成员共用一块内存空间

qsort()

qsort()功能:排序数组

void qsort(void *base,//要排序的数组的首地址

                size_t nmemb,//数组元素的个数

                size_t size,//单个元素的大小
                int (*compar)(const void *, const void *));//比较函数——提供比较依据

int compar(const void *a, const void *b)

{//比较函数——a、b代表要比较的数组元素

}

相关文章:

结构体structure、共用体union

目录 结构体 结构体类型的定义形式 结构体类型的大小 内存计算例子 共用体union 用共用体判断大小端 结构体和共用体对比 qsort() 结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型(用户自定义类型) struc…...

Spring自动注册-<bean>标签和属性解析

xml文件中最常见也最核心的就是<bean>,<Import>,<beans>,<alias>标签,关于它们的解析主要是BeanDefinitionParserDelegate类中.<bean>标签的解析最为复杂和重要. <bean>标签 processBeanDefinition(ele, delegate)方法中,主要是是对…...

【仿RabbitMQ消息队列】基于C++11中packaged_tack异步线程池

目录 什么是同步和异步&#xff1f; future 使用future和async配合管理异步任务 使用promise和future配合管理异步任务 使⽤std::packaged_task和std::future配合 C11异步线程池 什么是同步和异步&#xff1f; 同步&#xff08;Synchronous&#xff09; 同步编程是指程…...

免费下载专利

给大家提供一个可以免费下载专利的地方 链接&#xff1a;https://www.drugfuture.com/cnpat/cn_patent.asp...

CentOS7安装流程步骤详细教程

1. 简介 1.1. 概述 CentOS 7是一款基于Red Hat Enterprise Linux(RHEL)的开源Linux发行版,它提供了一个稳定、安全、高效的操作系统,适用于企业级应用、服务器、云计算等领域。CentOS 7以其高度的稳定性和安全性而闻名,它广泛应用于各种行业和领域,包括政府、金融、医疗、…...

【大模型从入门到精通17】openAI API 构建和评估大型语言模型(LLM)应用5

这里写目录标题 理论问题&#xff1a;实践问题&#xff1a;理论实践 理论问题&#xff1a; 1.描述评估LLM应用程序输出的重要性&#xff0c;并提及至少三个维度&#xff0c;这些输出应该在这几个维度上被评估。 2.解释在评估LLM应用程序时开发稳健的性能指标的作用&#xff0c…...

苹果手机无iCloud备份下“最近删除”照片的恢复策略

iPhone最近删除清空了照片还能恢复吗&#xff1f;大家都知道&#xff0c;照片对于我们来说是承载着美好回忆的一种形式。它记录着我们的平淡生活&#xff0c;也留住了我们的美好瞬间&#xff0c;因此&#xff0c;具有极其重要的纪念价值。但由于我们的失误操作导致照片被删除&a…...

Docker搭建Minio容器

Docker搭建Minio容器 前言 在上一集我们介绍了分布式文件存储行业解决方案以及技术选型。最终我们决定选用Minio作为分布式文件存储。 那么这集我们就在Docker上搭建Minio容器即可。 Docker搭建Minio容器步骤 创建Minio文件目录 我们选择创建/minio/data目录 修改目录权…...

【C++】多源BFS问题和拓扑排序

目录 多源BFS介绍 单源BFS和多源BFS的区别 SO如何解决多源BFS问题 多源之核心 矩阵 算法思路 代码实现 飞地的数量 算法思路 代码实现 地图中的最高点 算法思路 代码实现 地图分析 算法思路 代码实现 拓扑排序介绍 有向无环图 ​编辑 如何解决这类问题 课…...

CentOS 7 安装详细教程

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; CentOS 7 是一个稳定的企业级 Linux 发行版&#xff0c;广泛用于服务器环境。CentOS 7 是基于 Red Hat Enterprise Linux (RHEL) 构建的企业级 Linux 发行版&#xff0c;提供免费的、开源的操作系统&#xf…...

mybatis-plus + springboot 多对多实例

在MyBatis Plus中&#xff0c;自动填充数据是一种非常实用的功能&#xff0c;它可以自动地为一些字段设置默认值&#xff0c;比如创建时间和更新时间。对于多对多关系来说&#xff0c;虽然自动填充主要针对单一实体的字段&#xff0c;但在某些情况下&#xff0c;你可能也需要在…...

SpringBoot日志整合

Spring Boot 整合日志框架的核心是通过 spring-boot-starter-logging 依赖来实现的&#xff0c;它默认整合了 Logback 日志框架。 Spring Boot 对各种日志框架进行了自动配置&#xff0c;使得我们可以很容易地在 Spring Boot 应用中使用日志。 Spring Boot 在类路径下寻找 Log…...

信创教育:培养未来科技创新的生力军

随着全球数字化转型的加速&#xff0c;信息技术应用创新&#xff08;简称“信创”&#xff09;产业作为推动国家信息技术自主可控和产业升级的关键领域&#xff0c;正迎来前所未有的发展机遇。信创教育&#xff0c;作为培养未来科技创新生力军的重要阵地&#xff0c;其重要性和…...

slowfast

核心网络网络架构: 1、分别获取高频和低频图像数据 2、分别进行特征提取 3、特征融合 4、预测 网络结构细节&#xff1a;...

怎么调试python脚本

打开pycharm community 2019.1软件&#xff0c;创建一个项目。 创建一个py后缀的文件作为示范&#xff0c;文件名自己定义。 编写代码&#xff0c;然后右键点击进行运行&#xff0c;查看一下是否有问题。 点击右上角的虫子图标&#xff0c;然后下面会有控制面板出来&#xff0c…...

Flask获取请求信息

示例代码 from flask import Flaskapp = Flask(__name__)if __name__ == "__main__": app.run(debug=True) 1、获取请求头 from flask import request@app.route("/headers", methods=["GET"])def get_headers(): headers = request.heade…...

Overleaf中放置高分辨率图片的方法

如果将ppt中的图片另存为png或jpg等格式&#xff0c;如果图中有密集的编码网格&#xff0c;则生成的pdf会糊掉。如何确保生成的pdf中的图片放大后仍然保持细节&#xff1f;亲测方案&#xff1a; 1、将ppt中的图片尺寸记下来&#xff0c;然后在ppt→设计中将ppt模板的大小设置成…...

【C语言】动态内存管理(malloc,free,calloc,realloc详解 )

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:C语言: C语言方向&#xff08;基础知识和应用&#xff09; (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、…...

如何寻找数值仿真参数最优解?CFD参数优化详解3来袭

本期文章将通过2个简单案例演示参数优化的操作步骤&#xff0c;一起来看看吧&#xff01; 流程自动化 实现 CFD 参数优化&#xff0c;首先要创建流程自动化。用户可采用SimLab的Python宏命令&#xff0c;录制建模流程。或在HyperWorks CFD模块的Template Manager创建Tcl/Tk命令…...

虚拟机macos中构建llvm、clang并配置Xcode

安装虚拟机macos&#xff0c;并安装brew&#xff1a; 安装vmware&#xff1a;https://www.bilibili.com/video/BV1Wo4y1E7fc/安装最新版的macos&#xff1a;极限苹果-Mac论坛-提供Mac软件和macOS苹果系统镜像下载下载并安装brew&#xff1a;版本要低&#xff0c;我装的是4.3.5…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...