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

C和指针:结构体(struct)和联合(union)

结构体和联合

结构体

结构体包含一些数据成员,每个成员可能具有不同的类型。

数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。

结构声明

在声明结构时,必须列出它包含的所有成员。

struct tag {member-list} variable-list ;

定义一个结构体变量x(包含3个整数)

struct{
int a; int b; int c;
} x;

定义一个结构体数组或结构体指针

struct{int a; int b; int c;
}y[20],*z;

声明一个名为simple的结构体

struct SIMPLE { 
charb
float c;
};

使用声明的结构体定义结构体变量,结构体数组或者结构体指针

struct SIMPLE x;
struct SIMPLE y[20],*z;

为结构体变量重命名

typedef struct{int a; int b; int c;
}Simple;
Simple x;
Simple y[20],*z;
结构成员

结构成员可以是标量、数组、指针甚至是其他结构。

struct COMPLEX{float f;int a[20];long  *lp; struct SIMPLE s;struct SIMPLE sa[10];struct SIMPLE *sp;
};
结构成员的直接访问

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,左操作数就是结构变量

的名字,右操作数就是需要访问的成员的名字。

struct COMPLEX comp;

结构体中的结构体访问

comp.s.a

结构体中复杂变量的变量

((comp.sa)[4]).c
结构成员的间接访问

结构体成员指针可以使用->访问成员

struct COMPLEX *cp;
cp->f
cp->a
cp->s
结构的自引用

结构体中可以包含自身的指针(但是不能包含自身的变量),结构体中包含自己可以定义更复杂的数据结构,如链表或树。

struct A{struct A a;//非法A,a中还是包含a,无穷无尽
};

下面合法,因为指针的长度确定(32位或者64位)。

struct A{struct A *a;
};
结构的初始化
struct INIT_EX { int a;short b[10]; Simple c;
}x={10,{1,2,3,4,5},{25,'x',1.9 }};
结构、指针和成员
typedef struct {int a;short b[2];
}Ex2;
typedef struct EX {int a;char b[3];Ex2 c; struct EX *d
}Ex;

Ex x = { 10,"Hi",{ 5,{ -1,25 } },0 };
Ex *px = &x;

将会产生以下变量

px(右值):表示px指针,访问到的是px的内容(x的地址)

px(左值):表示

px+1:如果有结构体数组,表示下一个结构体。

*px(右值):解引用,表示访问的是整个结构。

*(px+1)作为右值,表示访问到下一个结构体(如果存在)

px->a:访问结构体成员

*px->c.b:访问x中c的b的第一个成员(优先级)

*px->d:对结构体中d指针进行解引用(前提是d不是NULL指针,对NULL指针解引用是一个错误)

结构的存储分配

字节对齐

struct ALIGN{char a; int b; char C;
};

系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此所有结构的起始存储位置必须是结构中边界要求最严格的数据类型所要求的位置。成员 a必须存储于一个能够被 4 整除的地址。结构的下一个成员是一个整型值,所以它必须跳过3个字节到达合适的边界才能存储,在整型值之后是最后一个字符。

如果声明了相同类型的第2个变量,它的起始存储位置也必须满足4这个边界,所以第1个结构的后面还要再跳过3个字节才能存储第2个结构。(每个结构将占据12个字节的内存空间但实际只使用其中的6个)

你可以在声明中对结构的成员列表重新排列,让那些对边界要求最严格的成员首先出现,对边界要求最弱的成员最后出现,这样可以最大限度地减少因边界对齐而带来的空间损失。

struct ALIGN2 {int  b;char a;char c;
};

所包含的成员和前面那个结构一样,但只占用8个字节的空间,节省了33%。当程序将创建几百个甚至几千个结构时,减少内存浪费的要求就比程序的可读性更为急迫。在这种情况下,在声明中增加注释可能避免可读性方面的损失。

作为函数参数的结构体

传值和传引用

传值:传递结构体副本结构体的每个成员都需要被复制到函数内,修改后再复制回来(如果返回值是结构体的话)。

传递结构体指针:最常用也是最高效的机制,只需要传递一个地址(指针),而不是整个结构体。函数可以直接修改原始结构体的成员,而不需要复制结构体,减少内存复制的开销。

选择何时传递结构体而非指针

当结构体非常小,其大小与指针大小相近或更小时,传递整个结构体可能不会比传递指针消耗更多的资源。然而,对于大多数实际应用中的结构体来说,它们通常包含多个成员,传递指针更为高效。

如果需要函数修改结构体的任何成员,则推荐使用指针传递方式,因为这样可以避免不必要的数据复制,并允许函数直接更新原始数据。

位段

结构可以实现位段(bit field)的能力。

位段的声明和结构类似,但它的成员是一个或多个位的字段。

这些不同长度的字段实际上存储于一个或多个整型变量中。位段的声明和任何普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明为int、signed int或 unsigned int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所告用的位的数目。

使用位段只是基于方便的目的。任何可以用位段实现的任务都可以使用移位和屏蔽来实现。

联合(union)

联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。

union可以存放不同数据类型的成员,union中各成员共享一段内存空间, 一个union变量的长度等于各成员中最长的长度,以达到节省空间的目的。该union变量可被赋予任一成员值,但每次只能赋一种值, 如果更改一个成员的值,会影响其他成员的值。(使用.运算符来访问union中的成员)

应用场景

    • inode节点中文件类型的定义为union,可以用union表示文件类型是普通文件,管道文件,字符文件,块设备文件还是套接字文件,这样可以节省空间
    • SGI alloc二级分配器中的空闲链表节点使用union,指针域和数据域共用一段内存,在分配内存的时候数据会覆盖指针域,在回收内存的时候指针域会覆盖数据域(一次只能表示出一种特性)
    • union可以判断主机是按大端还是小端存储(具体见套接字编程)

union{ short n; char num[2]; } 存一个数0x0102,判断num[0]是01(小端)还是02(大端)。

相关文章:

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问…...

[数据集][目标检测]电动车头盔佩戴检测数据集VOC+YOLO格式4235张5类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4235 标注数量(xml文件个数):4235 标注数量(txt文件个数):4235 标注…...

软件工程知识点总结(2):需求分析(一)——用例建模

1 软件项目开发流程: 需求分析→概要设计→详细设计→编码实施→测试→产品提 交→维护 2 系统必须做什么? 获取用户需求,从用户角度考虑,用户需要系统必须完成哪些工作,也就是对目 标系统提出完整、准确、清晰、具体…...

2024 年高教社杯全国大学生数学建模竞赛C题—农作物的种植策略(讲解+代码+成品论文助攻,均已更新完毕)

2024数学建模国赛选题建议团队助攻资料-CSDN博客文章浏览阅读1k次,点赞20次,收藏24次。通过分析5个题目的特点,可知数学建模常用的模型大概可以分为五大类——https://blog.csdn.net/qq_41489047/article/details/141925859 本次国赛white学长…...

?.操作符是什么

?.操作符在不同的编程语言和上下文中可能有不同的含义和用途,但一般来说,它并不是一个广泛存在于所有编程语言中的标准操作符。不过,基于一些编程语言的特性和习惯,我们可以对?.操作符进行一些推测和解释。 1. 可选链操作符&am…...

ArcGIS出图格网小数位数设置

1、比如要去掉格网后面的小数点,如何设置呢? 2、如下图设置。...

数学建模_缺失值处理_拉格朗日、牛顿插值(全)

- 缺失值处理 1. 识别缺失值 在处理缺失值之前,首先需要识别数据中的缺失值。 1.1 使用 isna() 和 isnull() Pandas 提供了 isna() 和 isnull() 方法来检测缺失值,二者功能相同。 import pandas as pddf pd.DataFrame({A: [1, 2, None, 4],B: [None, 2,…...

算法题之水壶问题

水壶问题 有两个水壶,容量分别为 x 和 y 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 target 升。 你可以: 装满任意一个水壶清空任意一个水壶将水从一个水壶倒入另一个水壶,直到接水壶已满,或倒水壶已空。 示…...

Java项目: 基于SpringBoot+mysql蜗牛兼职网兼职平台管理系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql蜗牛兼职网兼职平台管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操…...

C#数组中的Rank,GetUpperBound(), GetLength()

Rank-数组的秩,一维数组的Rank1;二维数组的Rank2; GetUpperBound()--获取每一维的索引的上限, 比如int[4,5], 那么GetUpperBound(0) 3; GetUpperBound(1) 4 ; 所以 对于二维数组来说 GetUpperBound(0)1行数; G…...

Android应用开发项目式教程——序

文章目录 Android技术本书特点本书内容本书参考 Android技术 Android是重要的客户端技术,因其开源开放的特点,Android在其初期就迅速成长为智能手机的主流操作系统,近年来更进一步成为智能电视、智能车载终端等智能设备的主流操作系统&#…...

【Spring Boot 3】【Web】统一处理 HTTP 请求体

【Spring Boot 3】【Web】统一处理 HTTP 请求体 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总…...

uni-app开发微信小程序

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,它允许开发者编写一次代码,然后发布到iOS、Android、Web(包括各种小程序平台如微信小程序、支付宝小程序、百度智能小程序等)以及各种快应用平台上。对于使用uni-app开发微信小…...

Qt开发框架--完整的软件开发框架

Qt开发框架包含一整套高度直观、模块化 的C 库类,并加载可简化应用程序开发的API。Qt 可生成高可读、易维护和可重用的代码,具有较高的运行时性能,且内存占用小。最重要的是,Qt是跨平台的。 Qt工具分为这么几个类别: …...

Python爬虫-Amazon亚马逊oData参数

前言 本文是该专栏的第37篇,后面会持续分享python爬虫干货知识,记得关注。 本文以“亚马逊Amazon”为例,主要获取亚马逊商品详情页的oData参数规律。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整…...

Q215 数组中第K大的元素

思路 可以用排序,但是不用全有序 还有个要求是O(n) 快排改版 快排只排需要的部分 public int findKthLargest(int[] nums, int k) {return quickSort(nums, 0, nums.length-1, nums.length-k);}public static int quickSort(int[] nums, …...

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组 Map<String, List<Bean>> newMap successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim()));获取对象集合里面的某个字段的集合 List<Bean> list new ArrayList&l…...

Maven快速上手使用指南的笔记

Maven Mini Guides Configuring for Reproducible Builds 使用Maven实现重复构建。 检查当前使用的插件的版本。 mvn artifact:check-buildplan修改pom.xml&#xff0c;增加如下配置&#xff0c;显式指定project.build.outputTimestamp的取值&#xff1a; <properties>…...

MySQL面试题大全和详解,含SQL例子

若有不理解&#xff0c;可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是一些常见的 MySQL 面试题及其解答&#xff0c;包含 SQL 示例。 1. 什么是 MySQL&#xff1f; 答&…...

java-redis-雪崩

Redis 雪崩问题 Redis雪崩 是指在 Redis 缓存系统中&#xff0c;当大量缓存同时失效时&#xff0c;所有请求直接打到数据库&#xff0c;导致数据库瞬间压力激增&#xff0c;甚至崩溃的现象。雪崩问题通常出现在高并发的系统中&#xff0c;因为缓存的失效导致后端数据库承受不了…...

LangChain串联DeepSeek时,如何用自定义OutputParser解决‘思考污染’问题?

LangChain串联DeepSeek时如何用自定义OutputParser解决"思考污染"问题 当我们在LangChain框架中串联使用具备"思考过程"输出的推理模型&#xff08;如DeepSeek&#xff09;时&#xff0c;经常会遇到一个棘手的问题&#xff1a;前序节点的思考标签会污染后续…...

模糊逻辑温度控制器:技术革新与市场前景深度解析

在工业自动化与智能制造浪潮中&#xff0c;温度控制作为核心工艺环节&#xff0c;其精度与稳定性直接影响产品质量与生产效率。模糊逻辑温度控制器凭借其独特的算法优势&#xff0c;正从传统PID控制器的“替代者”升级为高端制造场景的“刚需品”。本文将从技术原理、市场格局、…...

A股闪崩策略全解析:从数据接口选股到实时交易执行的完整流程

A股闪崩策略实战指南&#xff1a;从数据接口选股到自动化交易 引言&#xff1a;闪崩策略的市场逻辑与适用场景 2023年A股市场单日振幅超过5%的个股出现频率较前一年增长37%&#xff0c;这种市场波动为短线交易者创造了特殊机会。闪崩策略本质上是一种利用极端价格波动获取短期收…...

告别‘空树’!用UIAutomation Client伪装无障碍工具,搞定新版微信自动化(附完整C#项目)

深度解析Windows UIAutomation在微信自动化中的高阶应用 微信作为国民级通讯工具&#xff0c;其PC端自动化一直是企业RPA和开发者关注的热点。随着微信4.1版本的更新&#xff0c;传统的UI自动化方案遭遇了重大挑战——UI树变得"空空如也"。这背后隐藏着怎样的技术原理…...

JAVA重点基础、进阶知识及易错点总结(17)线程安全 synchronized 同步锁

&#x1f680; Java 巩固进阶 第17天 主题&#xff1a;线程安全 & synchronized 同步锁 —— 并发编程的第一道防线&#x1f4c5; 进度概览&#xff1a;今天攻克 多线程最核心难题&#xff1a;线程安全。这是面试必考、生产环境必用的知识点&#xff0c;直接决定你的代码能…...

个人知识库构建:OpenClaw+千问3.5-27B自动整理碎片化笔记

个人知识库构建&#xff1a;OpenClaw千问3.5-27B自动整理碎片化笔记 1. 为什么需要智能知识管理 作为一个常年被信息过载困扰的技术写作者&#xff0c;我的笔记系统曾经像一座杂乱无章的仓库。微信收藏夹里躺着2000未读文章&#xff0c;Obsidian里有500多个零散笔记&#xff…...

OpenClaw Exec Approvals 机制:在安全与效率之间寻找平衡

OpenClaw Exec Approvals 机制&#xff1a;在安全与效率之间寻找平衡当你第一次看到 /approve 弹窗时&#xff0c;是选择 allow-once 还是 allow-always&#xff1f;这个看似简单的决定&#xff0c;背后是安全与便利的永恒博弈。引言 在 Agent 开发和工作流自动化的世界里&…...

别再手动拼URL了!Spring Cloud项目里用OpenFeign调用其他服务,保姆级配置避坑指南

别再手动拼URL了&#xff01;Spring Cloud项目里用OpenFeign调用其他服务&#xff0c;保姆级配置避坑指南 微服务架构下&#xff0c;服务间的HTTP调用是家常便饭。很多开发者还在用RestTemplate手动拼接URL、处理序列化&#xff0c;不仅代码冗长&#xff0c;还容易出错。想象一…...

多场景适配:ClearerVoice-Studio支持16K/48K采样率,会议直播都适用

多场景适配&#xff1a;ClearerVoice-Studio支持16K/48K采样率&#xff0c;会议直播都适用 1. 为什么音频采样率如此重要&#xff1f; 在语音处理领域&#xff0c;采样率选择直接影响最终效果。就像相机像素决定照片清晰度一样&#xff0c;音频采样率决定了声音的"分辨率…...

Ostrakon-VL终端效果展示:深夜食堂风格终端打印输出全过程录屏

Ostrakon-VL终端效果展示&#xff1a;深夜食堂风格终端打印输出全过程录屏 1. 像素特工终端概览 在零售与餐饮行业的数字化转型浪潮中&#xff0c;我们开发了这款基于Ostrakon-VL-8B多模态大模型的Web交互终端。与传统工业级UI不同&#xff0c;我们采用了高饱和度的像素艺术风…...