结构体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代表要比较的数组元素

}

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

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

相关文章

CUDA+tensorflow+python+vscode在GPU下环境安装及问题汇总与解答

2024.8.14 因为要做深度学习,需要安装tensorflowgpu的环境,每次都搞不好整的很生气,本次将安装过程中参考的一些大佬的博客和安装过程中遇到的问题及解决方案总结一下,希望以后不要在这件事情上浪费时间。安装环境其实也没有想象中…

Halcon图像平滑与去噪

Halcon图像平滑与去噪 文章目录 Halcon图像平滑与去噪1. 均值滤波2. 中值滤波3. 高斯滤波5. 光照不均匀 有时拍摄的图像中会存在很多杂点和噪声,对于比较均匀的噪声,可以考虑用软件的算法进行 消除。例如,可以用图像平滑的方法进行去噪&#…

uniapp 自定义全局弹窗

自定义全局弹窗可在js和.vue文件中调用&#xff0c;unipop样式不满足&#xff0c;需自定义样式。 效果图 目录结构 index.vue <template><view class"uni-popup" v-if"isShow"><view class"uni-popup__mask uni-center ani uni-cust…

数学建模——启发式算法(蚁群算法)

算法原理 蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物&#xff0c;这得益于蚂蚁分泌的信息素&#xff0c;蚂蚁之间相互独立&#xff0c;彼此之间通过信息素进行交流&#xff0c; 从而实现群体行为。 蚁群算法的基本原理就是蚂蚁觅食的过程…

R语言的算数运算

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 3章3节&#xff1a;R的赋值操作与算术运算_r 链式赋值-CSDN博客文章浏览阅读172次。掌…

Ajax-02.Axios

Axios入门 1.引入Axios的js文件 <script src"js/axios-0.18.0.js"></script> Axios 请求方式别名: axios.get(url[,config]) axios.delete(url[,config]) axios.post(url[,data[,config]]) axios.put(url[,data[,config]]) 发送GET/POST请求 axios.get…

Windows的cmd命令行使用Linux类命令

Windows的cmd使用Linux类命令 去我的个人博客观看&#xff0c;观感更佳哦&#xff0c;&#x1f619;&#x1f619; 前言 我在使用Vscode编写C/C代码的时候&#xff0c;经常会用到Shell(你可以理解为命令行)&#xff0c;但是我不得不说Windows下Dos命令极其难用且拉跨&#x1f…

灵活易用的树莓派相机和计算机,降低了3D冰川建模的成本!

利兹大学的研究人员正在监测秘鲁的凯尔卡亚冰帽&#xff0c;这是世界上仅有的几个热带冰帽之一。 在欧洲成功进行试验之后&#xff0c;利兹大学地理学院​​​​​​​的研究人员正在安第斯山脉和喜马拉雅山脉使用树莓派计算机和树莓派高品质相机&#xff0c;建立低成本、长期…

C# simd指令之MaskMove

MaskMove指令说明&#xff1a;该方法将掩码向量中的每个非零元素对应的源向量中的元素移动到内存地址指定的位置。如果掩码中的元素为零&#xff0c;则对应的内存位置不会被修改。 MaskMove指令接受三个参数&#xff08;source、mask、address&#xff09;&#xff1a; 源向量…

养生生活视频素材去哪里找?养生系列视频素材网站分享

如何寻找高质量的养生视频素材。无论您是刚入行的新手&#xff0c;还是拥有众多粉丝的资深创作者&#xff0c;优质的养生视频素材都是吸引观众的关键。接下来&#xff0c;我将介绍一些顶级平台&#xff0c;帮助您轻松获取各类养生视频素材。 蛙学网 首先推荐的平台是蛙学网。这…

鸿蒙开发APP应用UX体验标准

基础体验 应用导航 3.1.1.1 系统返回 页面布局 3.1.2.1 布局基础要求 3.1.2.2 挖孔区适配 人机交互 3.1.3.1 避免与系统手势冲突3.1.3.2 典型手势时长设计3.1.3.3 点击热区 视觉风格 3.1.4.1 色彩对比度3.1.4.2 字体大小 3.1.4.3 图标 3.1.4.3.1 应用图标3.1.4.3.2 界…

个体内比较不同自动化背景增强(BPE)评估方法在乳腺MRI中的效果:| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Intraindividual Comparison of Different Methods for Automated BPE Assessment at Breast MRI: 个体内比较不同自动化背景增强&#xff08;BPE&#xff09;评估方法在乳腺MRI中的效果&#xff1a; Background 背景 The level of background parenchymal enh…

flutter 画转盘

import package:flutter/material.dart; import dart:math;const double spacingAngle 45.0; // 每两个文字之间的角度 // 自定义绘制器&#xff0c;ArcTextPainter 用于在圆弧上绘制文字 class ArcTextPainter extends CustomPainter {final double rotationAngle; // 动画旋…

elementplus 二次封装 select 自定义指令上拉加载更多 完美解决 多次接口调用 重新加载数据多次调用数据!!!

效果&#xff1a;&#xff08;名字都是测试数据 随便乱写的 若有冒犯 请联系&#xff09; select 二次封装 网上的这种自定义指令上拉加载更多的实例有很多&#xff0c;但是基本都是有缺陷和问题的。为了记录这个问题 我研究了一天&#xff0c;在今天终于搞定了 呜呜呜。 网上…

TSP-Detection:CMU 提出抛弃交叉注意力的 DETR 变体 | ICCV 2021

DETR基于Transformer将目标检测视为集合预测问题&#xff0c;实现了最先进的性能&#xff0c;但需要超长的训练时间才能收敛。论文研究了DETR优化困难的原因&#xff0c;揭示了收敛缓慢因素主要是匈牙利损失和Transformer交叉注意机制。为了克服这些问题&#xff0c;论文提出了…

微信小程序--26(全局配置-1)

一、全局配置文件 1.标志 app.json 2.配置项 pages 记录当前小程序所有页面的存放路径 window 全局配置小程序窗口配置 tabBar 设置小程序底部的tabBar效果 style 是否启用新版本的组将样式 3.window 导航栏区域 navigationBar …

11 Linux 设备驱动

11 Linux 设备驱动 1、Linux软件特点1.1 用户空间1.2 内核空间 2、Linux程序2.1 应用程序2.2 内核程序2.2.1 编程2.2.2 编译 2.3 内核命令行传参2.3.1 应用程序的命令行传参2.3.2 内核程序命令行传参 2.4 内核程序符号导出2.4.1 应用程序多文件之间的访问调用2.4.1 内核多文件之…

1Panel应用推荐:KubePi开源Kubernetes管理面板

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

H7-TOOL混合脱机烧录以及1拖4不同的通道烧录不同的程序操作说明(2024-08-07)

【应用场景】 原本TOOL的1拖4是用于同时烧录相同程序给目标板&#xff0c;但有时候一个板子上有多个不同的MCU&#xff0c; 客户希望仅通过一个TOOL就可以完成对板子上多个MCU的烧录&#xff0c;也就是1拖4不同的通道烧录不同的程序&#xff0c;此贴为此制作。 【实验目标】…

序列建模之循环和递归网络 - 循环神经网络篇

序言 在探索序列数据的深层规律时&#xff0c;循环神经网络&#xff08; RNN \text{RNN} RNN&#xff09;以其独特的设计思想成为了序列建模领域的中流砥柱。与传统的神经网络不同&#xff0c; RNN \text{RNN} RNN引入了循环结构&#xff0c;使得网络能够处理任意长度的序列数…