结构体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;
结构体类型的大小计算
内存对齐是指将数据存储在特定的地址上,以便硬件能够更高效地访问这些数据。不同的数据类型(例如
int
、char
、float
等)通常有不同的对齐要求,这些要求通常与数据类型的大小相关。例如:
char
类型的数据通常要求对齐到1字节的边界。int
类型的数据通常要求对齐到4字节的边界。double
类型的数据通常要求对齐到8字节的边界。内存对齐规则
基础对齐原则:结构体中的每个成员都必须按照其数据类型的对齐要求对齐。比如,如果一个结构体包含一个
int
,那么这个int
成员必须出现在一个4字节对齐的地址上。结构体对齐规则:结构体的总大小必须是其最大成员对齐要求的整数倍。例如,如果一个结构体中最大的成员是
double
(8字节对齐),那么结构体的总大小也必须是8的倍数,即使可能会存在一些“填充字节”(padding bytes)。
为什么要内存对齐(提高效率)
内存对齐的主要目的是提高访问内存的效率。在现代计算机中,CPU通常是按块(比如4字节或8字节)从内存中读取数据的。如果数据是对齐的,CPU可以一次性读取整块数据,这样效率更高。
如果数据未对齐,CPU可能需要进行多次内存访问才能读取完整的数据,或者需要进行额外的计算来调整地址,这会导致性能下降。
内存计算例子
在这个结构体 demo1
中,有一个整数成员 int i
和一个匿名 union
,该 union
包含以下三个成员:
char s[7]
:一个长度为7的字符数组,占用7个字节。int v
:一个整数,占用4个字节。float f
:一个浮点数,占用4个字节。
结构体的内存计算
-
匿名
union
的大小:union
的大小由其最大的成员决定。char s[7]
占用7个字节。int v
占用4个字节。float f
占用4个字节。 因此,union
的大小为7字节(char s[7]
是最大的成员)。
-
结构体的对齐要求:
int i
需要4字节对齐。union
的最大成员char s[7]
,虽然它本身是7个字节,但由于int v
和float f
可能会让整个结构体具有更严格的对齐要求,假设int
和float
都需要4字节对齐,整个union
的大小可能会被填充到8个字节。
-
计算总大小:
int i
占用4字节。union
占用8字节(对齐到4字节的倍数)。- 因此,整个结构体
demo1
的大小为4(int i
) + 8(union
) = 12字节。
共用体union
语法
union 共用体名
{
成员变量;
};
union demo
{
char a;
short b;
int c;
};
共用体:共用一块内存空间(最大成员的空间)
共用体初始化时只能给一个值,且默认给到第一个成员
共用体变量中的值,取决于最后一次给的值,还要看能影响几个值
用共用体判断大小端
在这个代码片段中,union
中有两个成员:
int a
:通常占用4个字节char b
:占用1个字节
由于 union
中所有成员共享同一块内存,因此 union
的大小由其最大的成员决定。在这个例子中,int a
是 union
中最大的成员,占用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异步线程池
目录 什么是同步和异步? future 使用future和async配合管理异步任务 使用promise和future配合管理异步任务 使⽤std::packaged_task和std::future配合 C11异步线程池 什么是同步和异步? 同步(Synchronous) 同步编程是指程…...
免费下载专利
给大家提供一个可以免费下载专利的地方 链接: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
这里写目录标题 理论问题:实践问题:理论实践 理论问题: 1.描述评估LLM应用程序输出的重要性,并提及至少三个维度,这些输出应该在这几个维度上被评估。 2.解释在评估LLM应用程序时开发稳健的性能指标的作用,…...
苹果手机无iCloud备份下“最近删除”照片的恢复策略
iPhone最近删除清空了照片还能恢复吗?大家都知道,照片对于我们来说是承载着美好回忆的一种形式。它记录着我们的平淡生活,也留住了我们的美好瞬间,因此,具有极其重要的纪念价值。但由于我们的失误操作导致照片被删除&a…...
Docker搭建Minio容器
Docker搭建Minio容器 前言 在上一集我们介绍了分布式文件存储行业解决方案以及技术选型。最终我们决定选用Minio作为分布式文件存储。 那么这集我们就在Docker上搭建Minio容器即可。 Docker搭建Minio容器步骤 创建Minio文件目录 我们选择创建/minio/data目录 修改目录权…...
【C++】多源BFS问题和拓扑排序
目录 多源BFS介绍 单源BFS和多源BFS的区别 SO如何解决多源BFS问题 多源之核心 矩阵 算法思路 代码实现 飞地的数量 算法思路 代码实现 地图中的最高点 算法思路 代码实现 地图分析 算法思路 代码实现 拓扑排序介绍 有向无环图 编辑 如何解决这类问题 课…...
CentOS 7 安装详细教程
大家好,我是程序员小羊! 前言: CentOS 7 是一个稳定的企业级 Linux 发行版,广泛用于服务器环境。CentOS 7 是基于 Red Hat Enterprise Linux (RHEL) 构建的企业级 Linux 发行版,提供免费的、开源的操作系统…...
mybatis-plus + springboot 多对多实例
在MyBatis Plus中,自动填充数据是一种非常实用的功能,它可以自动地为一些字段设置默认值,比如创建时间和更新时间。对于多对多关系来说,虽然自动填充主要针对单一实体的字段,但在某些情况下,你可能也需要在…...
SpringBoot日志整合
Spring Boot 整合日志框架的核心是通过 spring-boot-starter-logging 依赖来实现的,它默认整合了 Logback 日志框架。 Spring Boot 对各种日志框架进行了自动配置,使得我们可以很容易地在 Spring Boot 应用中使用日志。 Spring Boot 在类路径下寻找 Log…...
信创教育:培养未来科技创新的生力军
随着全球数字化转型的加速,信息技术应用创新(简称“信创”)产业作为推动国家信息技术自主可控和产业升级的关键领域,正迎来前所未有的发展机遇。信创教育,作为培养未来科技创新生力军的重要阵地,其重要性和…...
slowfast
核心网络网络架构: 1、分别获取高频和低频图像数据 2、分别进行特征提取 3、特征融合 4、预测 网络结构细节:...
怎么调试python脚本
打开pycharm community 2019.1软件,创建一个项目。 创建一个py后缀的文件作为示范,文件名自己定义。 编写代码,然后右键点击进行运行,查看一下是否有问题。 点击右上角的虫子图标,然后下面会有控制面板出来,…...
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等格式,如果图中有密集的编码网格,则生成的pdf会糊掉。如何确保生成的pdf中的图片放大后仍然保持细节?亲测方案: 1、将ppt中的图片尺寸记下来,然后在ppt→设计中将ppt模板的大小设置成…...
【C语言】动态内存管理(malloc,free,calloc,realloc详解 )
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:C语言: C语言方向(基础知识和应用) (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、…...
如何寻找数值仿真参数最优解?CFD参数优化详解3来袭
本期文章将通过2个简单案例演示参数优化的操作步骤,一起来看看吧! 流程自动化 实现 CFD 参数优化,首先要创建流程自动化。用户可采用SimLab的Python宏命令,录制建模流程。或在HyperWorks CFD模块的Template Manager创建Tcl/Tk命令…...
虚拟机macos中构建llvm、clang并配置Xcode
安装虚拟机macos,并安装brew: 安装vmware:https://www.bilibili.com/video/BV1Wo4y1E7fc/安装最新版的macos:极限苹果-Mac论坛-提供Mac软件和macOS苹果系统镜像下载下载并安装brew:版本要低,我装的是4.3.5…...
Java 中的 @SneakyThrows 注解详解:简化异常处理的利与弊
在 Java 开发中,异常处理是一个不可避免的重要部分。我们经常需要处理各种检查型异常(checked exceptions),这有时会导致代码变得冗长且难以维护。为了简化异常处理,Lombok 提供了一个强大的注解——SneakyThrows。本文…...
系统编程 day11 进程(线程)3
fork函数的总结: 总结对进程学习之中的回收函数wait wait函数: 1.获取子进程的退出状态 2.回收资源------会让僵尸态的子进程销毁 注:1.wait函数本身是一个阻塞操作,会使调用者阻塞 2.父进程要获得子进程的退出状态 子进程&…...
[ Python 原理分析 ]如何实现用户实现博客文章点赞-物联网Python
目录 一、前言 二、Python爬虫 三、详细操作 3.1 建立基本工程 3.2 获取文章列表 3.2.1 找到获取文章请求 3.2.2 分析获取请求 3.2.3 构建获取请求 3.2.4 调试打印 3.3 实现点赞操作 3.3.1 判断点赞状态 3.3.2 找到点赞请求 3.2.3 分析点赞请求 3.2.4 构建点赞请…...
【47 Pandas+Pyecharts | 杭州二手房数据分析可视化】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 过滤数据2.3 行政区处理2.4 地址处理2.5 房屋信息处理2.6 面积处理2.7 楼层处理2.8 年份处理2.9 房价处理2.10 删除不用的列2.11 数据类型转换2.12 查看…...
C++入门基础知识13
C 的关键字(接上一篇博文)!! 10. const_cast用法: 该运算符用来修改类型的 const 或 volatile 属性。除了 const 或 volatile 修饰之外, type_id 和 expression 的类型是一样的。常量指针被转化成非常量指针…...
IP地址证如何实现HTTPS访问?(内网IP、公网IP)
IP地址证书(全称为IP地址的SSL/TLS证书)是实现通过IP地址进行HTTPS访问的关键。以下是实现这一目标的详细步骤: 一、选择证书颁发机构(CA) 1.选择支持IP证书的CA:并非所有证书颁发机构都提供为IP地址颁…...
东土科技车规级网络芯片获批量应用
东土科技孵化的我国第一颗国产汽车芯片名录的车规级TSN交换网络芯片,于近期获得国家新能源汽车技术创新中心10万片芯片订单,将规模化应用于车载网关,赋能新一代自主可控汽车网络通信架构。 车规级TSN交换网络芯片于2021年流片成功࿰…...
nvidia系列教程-AGX-Orin pcie扩展M.2磁盘调试笔记
目录 前言 一、AGX-Orin pcie接口介绍 二、原理图连接 三、SDK配置 四、M.2磁盘调试 总结 前言 NVIDIA Jetson AGX Orin 是一款强大的嵌入式平台,广泛应用于 AI 推理、机器人和自动驾驶等领域。在扩展存储方面,PCIe 接口的 M.2 SSD 是一个常见的选择。本篇博客将记录如何…...
haproxy七层代理知识点以及各种配置
1.为什么用haproxy 当后端主机有一个出现问题了的时候,我们需要访问的流量全部打到正常工作的后端主机,所以我们需要后端检测,lvs没有后端检测,所以就需要用到haproxy 2.负载均衡 2.1 什么是负载均衡 负载均衡,Loa…...
uniapp自定义浮动图标、列表布局
uniapp自定义浮动图标 <button class="fab" @click="goPage"><image src="../../../static/yiyuan.png" mode="" style="width: 60rpx;height:60rpx;"></image></button>.fab {z-index: 100;positi…...
网站流量如何赚钱/刷百度关键词排名优化
1、引用和指针的区别:引用是别名。必须和具体的对象绑定,在声明的时候初始化,以后不能改变绑定关系;引用不能声明为null类型;指针是一种变量,它的值为地址,在使用的时候可以改变,也可…...
宁波品牌网站公司排名/福州关键词排名软件
2017年9月4日15时,中国人民银行等7部委正式发布《中国人民银行 中央网信办 工业和信息化部 工商总局 银监会 证监会 保监会关于防范代币发行融资风险的公告》(一下简称《公告》),公告称,本公告发布之日起(9…...
主机网站建设制作/益阳网络推广
一、安装JRebel插件 1. 在线安装 打开设置 File ->setting或者直接点设置的图标进入 在线下载并安装 2. 激活插件 插件默认能试用14天,可用如下方式激活。 打开idea后,看到jr图标就代表安装插件成功,还有在设置里面会多出Jrebel&#…...
dw做网站导航条/市场调研流程
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种…...
网上客服软件/关键词优化推广公司
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 事实上,Python 程序在执行过程中同样需要编译(Compile)ÿ…...
建设网站服务器怎么选/百度权重查询
两者的区别在于: 方式1直接在 render_template中包含参数传递到模板中的只能在这个特定模板中使用。而通过方式2自定义变量模式的变量在全部的模板中都可以直接调用。 1、直接在 render_template中包含参数,传递到模板中去。 **2、自定义变量ÿ…...