结构体和共用体

一.简述

结构体和共用体是C语言中两种重要的用户自定义数据类型,用于将不同类型的数据组合在一起。它们在内存布局、用途和访问方式上都有显著的区别和一些相似点。以下是详细的介绍:

Ⅰ结构体

定义

struct Example {int a;float b;char c;};

①内存布局

结构体中的每个成员都有自己的内存空间,且各成员在内存中是按顺序排列的。每个成员都有自己的地址,结构体的总大小是所有成员大小的总和(可能加上一些填充字节以满足内存对齐要求)。

②使用场景

结构体适用于需要将多种类型的数据组合在一起并且需要同时访问它们的场景。例如,在表示一个点(有x和y坐标)或一个学生的信息(有名字、年龄、成绩等)时,可以使用结构体。

③访问方式

通过结构体变量和成员名访问结构体中的成员。例如:

struct Example example;example.a = 10;example.b = 20.5;example.c = 'c';

Ⅱ共用体

定义

union Example {int a;float b;char c;};

①内存布局

共用体中的所有成员共享同一段内存。这意味着在任一时刻,只有一个成员能有效地存储数据。共用体的总大小是其最大成员的大小

②使用场景

共用体适用于节省内存的场景,尤其是当需要在不同时间存储不同类型的数据时。例如,在处理多个数据类型但同时只需要一个有效的值时,可以使用共用体。

③访问方式

通过共用体变量和成员名访问共用体中的成员。例如:

union Example example;example.a = 10; // 使用example.aexample.b = 20.5; // 此时example.a的值将不再有效,因为它们共享同一段内存

二.异同总结

①相似点

语法:两者的定义和成员访问方式类似。

用途:都用于将不同类型的数据组合在一起。

②不同点

(1)内存分配:

结构体:每个成员有独立的内存空间,总大小是所有成员大小之和

共用体:所有成员共享同一段内存,总大小是最大成员的大小。

(2)访问方式:

结构体:可以同时访问所有成员。

共用体:在任一时刻只能有效访问一个成员,访问其他成员会导致未定义行为。

(3)数据有效性:

结构体:所有成员的数据始终有效互不影响

共用体:每次只能有效存储一个成员的数据,写入一个成员会覆盖其他成员的数据。

(4)用途:

结构体:用于逻辑上相关的多种数据类型的组合,且需要同时访问这些数据。

共用体:用于节省内存或在不同时间段存储不同类型的数据。

三.示例

①结构体示例:

#include <stdio.h>struct Point {int x;int y;};int main() {struct Point p;p.x = 10;p.y = 20;printf("Point coordinates: (%d, %d)\n", p.x, p.y);return 0;}

②共用体示例:

#include <stdio.h>union Data {int i;float f;char str[20];};int main() {union Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 220.5;printf("data.f: %f\n", data.f);strcpy(data.str, "C Programming");printf("data.str: %s\n", data.str);return 0;}

(注:代码中,虽然使用了共用体,但代码未能展示共用体在任一时刻只能有效访问一个成员的特性。这是因为每次给一个成员赋值后,立刻打印它的值,然后再给另一个成员赋值。这种情况下,每次打印的都是刚赋值的成员,所以没有展示出覆盖问题。

通过以上的介绍和示例,可以清晰地看到结构体和共用体在定义、内存布局、使用场景和访问方式上的异同。

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

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

相关文章

数据结构(三)循环链表

文章目录 一、循环链表&#xff08;一&#xff09;概念&#xff08;二&#xff09;示意图&#xff08;三&#xff09;操作1. 创建循环链表&#xff08;1&#xff09;函数声明&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 2. 插入&#xff08;头插&#x…

【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词

【LeetCode刷题】Day 9 题目1&#xff1a;904. 水果成篮思路分析&#xff1a;思路1&#xff1a;暴力枚举哈希表思路2&#xff1a;窗口滑动哈希表 题目2&#xff1a;438. 找到字符串中所有字母异位词思路分析&#xff1a;思路1&#xff1a;暴力枚举哈希表思路2&#xff1a;滑动窗…

极简编程:一行JS代码获取全球各城市当前时间!

之前在一些国际化网站看到过&#xff0c;他们展示了当前北京、纽约和伦敦的时钟&#xff0c;在一次住店的时候&#xff0c;我也看到了类似的3个时钟&#xff0c;甚至更多&#xff0c;有的会展示东京时间。 让我觉得获取一些全球重点城市的当前时间&#xff0c;会是一个很常用的…

【NumPy】关于numpy.add()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

使用Java读取Word表格数据封装到实体类中

1、引入pom文件&#xff1a; <!-- POI--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi<…

简述对于Vue的diff算法理解

Vue 的 diff 算法&#xff0c;也称为“虚拟 DOM 的差异算法”或“Reactivity System”&#xff0c;是 Vue.js 框架中一个核心且高效的部分&#xff0c;它允许 Vue 在不需要重新渲染整个 DOM 的情况下&#xff0c;通过最小化地更新 DOM 来实现视图更新。以下是关于 Vue diff 算法…

5.4 Go 匿名函数与闭包

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

ASO优化0基础关键词应用指导

很多人还在为如何推广App而头疼&#xff0c;小柚肯定的告诉你。ASO优化是目前App推广中最基础的办法&#xff0c;是不可或缺的一个环节。ASO优化内容包括关键词、应用描述、评论等。关键词一般分为行业通用词、品牌词、竞品词等&#xff0c;优化师利用专业的ASO工具提供查询。为…

网站笔记:huggingface——can you run it?

Can You Run It? LLM version - a Hugging Face Space by Vokturz 1 配置设置部分 Model Name就是需要测量的模型名称 GPU Vendor ——GPU供应商 Filter by RAM (按RAM过滤) 筛选出所有内存容量在选择范围之间的GPU GPU 下拉菜单选择具体的GPU型号 LoRa % trainable param…

靠AI创意,变现20w!

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 之前X小鹿一直在各…

记录一次安装k8s初始化失败

实例化 kubeadm init --configkubeadm.yaml --ignore-preflight-errorsSystemVerification报错 [init] Using Kubernetes version: v1.25.0 [preflight] Running pre-flight checks error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: co…

海外仓erp系统是什么?和海外仓管理系统一样吗?

为了满足海外仓全球化发展的大趋势&#xff0c;同时提升海外仓运转的效率&#xff0c;一套好用&#xff0c;性价比高的海外仓管理系统还是非常重要的。 不过很多海外仓企业其实不太分得清erp系统和海外仓管理系统的差异&#xff0c;今天我们就来系统的聊一下&#xff0c;方便大…

K8S有了Service,为什么还要Ingress?

1、有了Service为什么还要Ingress? NodePort对外暴露端口存在的不足&#xff1a; 一个端口只能一个服务使用, 端口需要提前规划。 随着业务扩展, 端口的管理将是一个头疼的问题 只支持4层的负载均衡 LoadBalancer存在的不足&#xff1a; 贵、贵、贵。 要上云(俗话说上云…

需求跟踪矩阵是什么?怎么创建?一文详解

一、什么是需求跟踪矩阵 对项目经理或产品经理来说&#xff0c;需求清单肯定不陌生&#xff0c;那什么是需求跟踪矩阵呢&#xff1f; 需求跟踪矩阵&#xff08;Requirement Track Matrix&#xff0c;简称RTM &#xff09;&#xff0c;是把产品需求从其来源连接到能满足需求的…

使用MinGW来构建C语言项目

文章目录 安装MinGW编写C语言源代码创建构建脚本构建项目 MinGW构建C语言项目的基本步骤&#xff1a; 安装MinGW 从MinGW的官方网站下载MinGW安装程序。 运行安装程序&#xff0c;选择安装基本组件&#xff0c;如gcc编译器、gdb调试器和make工具。 安装完成后&#xff0c;将…

无人机助力光伏项目测绘建模

随着全球对可再生能源需求的不断增长&#xff0c;光伏项目作为其中的重要一环&#xff0c;其建设规模和速度都在不断提高。在这一背景下&#xff0c;如何高效、准确地完成光伏项目的测绘与建模工作&#xff0c;成为了行业发展的重要课题。近年来&#xff0c;无人机技术的快速发…

2024.05.11 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招&实习 | 小米24届春招&25届实习岗位热招中&#xff08;内推&#xff09; 校招&实习 | 小米24届春招&25届实习岗位热招中&#xff08;内推&#xff09; 2、校招 | …

哪个品种能够叫板白银现货t+d?

白银TD是在上海黄金交易所挂牌的白银投资品种&#xff0c;它可以说是国内版的现货白银交易&#xff0c;大家也可以把它理解成为白银交易的“快速通道”。通过它&#xff0c;投资者可以更加灵活地买卖白银&#xff0c;实现对内地白银价格的跟踪&#xff0c;并获得一定的杠杆化收…

git工作流程

以财务开发为例子&#xff1a; 1. 新建分支 1.1. upstream新建分支&#xff1a;finance-feature 1.2. origin新建对应分支&#xff1a;finance-feature 1.3 新建本地分支 git branch finance-feature 注&#xff1a; 同步远程分支&#xff1a;git fetch upstream feature…

pwa动态修改manifest.json(start_url)

pwa动态设置manifest.json 引言 在使用pwa开发时&#xff0c;因需求原因&#xff0c;需要动态设置pwa安装应用的地址&#xff0c;也就是manifest.json中的start_url地址&#xff0c;比如说业务场景需要携带不同的参数在安装地址后台&#xff0c;从中遇到了很多问题&#xff0…