C语言 自定义类型——联合体

news2024/11/24 17:24:13

目录:

  • 一、联合体是?
    • 声明
    • 计算内存大小
  • 二、联合体的特点
    • 例如
  • 三、联合体大小的计算
    • 规则:
  • 四、应用
    • 习1
    • 习2

一、联合体是?

联合体和结构体差不多,但是其最大的区别在于联合体所有的成员共用一块内存空间。所以联合体也叫共用体。联合体通常用于节省内存空间

那么联合体在内存中是怎么存储的呢?好奇怪鸭!共用一块内存空间不就乱套了嘛,带着疑问往下看

声明

//结构体
struct Struct
{
	char c;
	int i;
};

//联合体
union Un
{
	char c;
	int i;
};

计算内存大小

#include<stdio.h>
union Un
{
	char c;
	int i;
};

int main()
{
	union Un u = { 0 };
	printf("sizeof(u): %d\n", sizeof(u));

	return 0;
}
//sizeof(u): 4

为什么是4?
因为编译器只为最大的成员分配足够空间,其他成员和最大成员共享这一块内存空间。也会存在内存对齐的情况,后面讲。

二、联合体的特点

既然内存共享,那地址怎么区分?


#include<stdio.h>
union Un
{
	char c;
	int i;

};

int main()
{
	union Un u = { 0 };
	printf("&u: %d\n", &u);
	printf("&u.c: %d\n", &u.c);
	printf("&u.i: %d\n", &u.i);

	return 0;
}

在这里插入图片描述
1.地址一样,所以改变其中的一个值,那么另外的值也会发生改变。

例如

#include<stdio.h>
union Un
{
	char c;
	int i;

};

int main()
{
	
	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);

	return 0;
}

打开自己电脑上的VisualStudio 2022运行代码,调试,看内存。
给un.i赋值

在这里插入图片描述
给un.c赋值
在这里插入图片描述
2. 经过我们仔细观查,就不难画出un的内存布局
给un.c赋值时是从低地址开始赋值,到整个自己所占的字节。

在这里插入图片描述

三、联合体大小的计算

引出联合体大小的计算,不仅仅是联合体中最大的成员所占字节数。

#include <stdio.h>

union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	//下⾯输出的结果是什么?
	printf("sizeof(union Un1): %d\n", sizeof(union Un1));
	printf("sizeof(union Un2): %d\n", sizeof(union Un2));
	return 0;
}

在这里插入图片描述
不再是5和7这么简单了。

规则:

  • 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
  • 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。(和结构体内存对齐第四条类似!!!)
    在这里插入图片描述
    在这里插入图片描述

四、应用

节省空间

习1

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

  • 图书:书名、作者、⻚数
  • 杯⼦:设计
  • 衬衫:设计、可选颜⾊、可选尺⼨

那我们j就会写出:

struct gift_list
{
	//库存 价格 名字
	int reserve;
	double price;
	char name[10];

	//图书:书名 作者 页数
	char author[10];
	int page;

	//杯子:设计
	char design[20];

	//衬衫:设计 颜色 尺寸
	char color[10];
	float size;

};

那么在创建书时,杯子和衬衫的属性是没有用到的。
在创建杯子时,书和衬衫的的属性是没有用到的。
在创建衬衫时,书和杯子的的属性是没有用到的。
会浪费空间。
这里就可以用到所学的联合体。

struct gift_list
{
	//库存 价格 名字 商品类型
	int reserve;
	double price;
	int item_type;

	union 
	{
		//图书:书名 作者 页数
		struct book
		{
			char name[10];
			char author[10];
			int page;

		};
		struct cup
		{
			//杯子:设计
			char design[20];
		};
		
		struct shirt
		{
			//衬衫:设计 颜色 尺寸
			char design[20];
			char color[10];
			float size;
		};
		
	}item;
	

};

习2

写⼀个程序,判断当前机器是⼤端?还是⼩端?( 用联合体 )
如果不知道大小端的同学可以 -> 点击链接: link

欢迎大家在评论区交流。

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

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

相关文章

平滑 3d 坐标

3d平滑 import torch import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dclass SmoothOperator:def smooth(self, vertices):# 使用一维平均池化进行平滑vertices_smooth F.avg_pool1d(vertices.p…

第50期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

五道数组习题,只过思路

建议先过一遍&#xff1a;保研机试前的最后七道数组题-CSDN博客 第一题&#xff1a; 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; ​ 跟合并两个有序链表类似&#xff0c; 快慢指针的用法&#xff0c;新建立一个数组&#xff0c;再将数组赋给nums1。 第…

mysql 不停的重启关闭

早上在使用phpstudy的时候&#xff0c;发现自己的mysql5.7和5.8都出现了问题&#xff0c;就是不停的重启&#xff0c;在梳理了状况之后&#xff0c;可能是硬盘的内存空间不足&#xff0c;或者硬盘出现了问题&#xff1b;于是我将mysql 重新安装了一次&#xff0c;整个问题就解决…

图算法必备指南:《图算法:行业应用与实践》全面解读,解锁主流图算法奥秘!

《图算法&#xff1a;行业应用与实践》于近日正式与读者见面了&#xff01; 该书详解6大类20余种经典的图算法的原理、复杂度、参数及应用&#xff0c;旨在帮助读者在分析和处理各种复杂的数据关系时能更好地得其法、善其事、尽其能。 全书共分为10章&#xff1a; 第1~3章主要…

苹果删除的短信怎么恢复?这里有4个恢复技巧

手机短信已成为我们日常沟通中不可或缺的一部分&#xff0c;其中包含了与家人、朋友的温馨对话&#xff0c;以及与工作伙伴的重要信息。然而&#xff0c;有时我们可能会因为误操作或其他原因不小心删除了重要的短信。请别担心&#xff0c;本文将为您详细介绍删除的短信怎么恢复…

为什么说气膜是建造游泳馆的好选择?—轻空间

随着气温逐渐攀升&#xff0c;夏日游泳成为人们追求凉爽的理想选择。在这个时候&#xff0c;选择气膜建筑作为游泳馆的建筑材料具有许多优势。 首先&#xff0c;气膜建筑具备出色的隔热和保温效果。其特殊的材料和结构设计有效隔绝了外界高温&#xff0c;同时保持了良好的通风和…

【吊打面试官系列】Java高并发篇 - 如何让正在运行的线程暂停一段时间?

大家好&#xff0c;我是锋哥。今天分享关于 【如何让正在运行的线程暂停一段时间&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 如何让正在运行的线程暂停一段时间&#xff1f; 我们可以使用 Thread 类的 Sleep()方法让线程暂停一段时间。需要注意的是&#x…

antd vue pro (vue 2.x) 多页签详细操作

antd vue pro 多页签配置操作&#xff0c;具体操作如下。 1.引入 tagviews文件 在 store/modules 中创建 tagviews.js &#xff0c;复制一下代码到文件中保存 const state {visitedViews: [],cachedViews: [] }const mutations {ADD_VISITED_VIEW: (state, view) > {if …

【IP:Internet Protocol,子网(Subnets),IPv6:动机,层次编址:路由聚集(rout aggregation)】

文章目录 IP&#xff1a;Internet Protocol互联网的的网络层IP分片和重组&#xff08;Fragmentation & Reassembly&#xff09;IP编址&#xff1a;引论子网&#xff08;Subnets&#xff09;特殊IP地址IP 编址: CIDR子网掩码&#xff08;Subnet mask&#xff09;转发表和转发…

64-RJ45网口电路设计

视频链接 RJ45网口电路设计01_哔哩哔哩_bilibili RJ45网口电路设计 千兆(十兆、百兆、千兆自适应)以太网电路设计&#xff08;参考第2课&#xff09; 万兆以太网电路设计&#xff08;参考第3课&#xff09; Pcie转网口电路设计&#xff08;参考第49课&#xff09; RGMII &…

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度&#xff0c;还增强了用户界面的动态性和交互性&#xff0c;允许开发者将应用界面划分为多个独立、可重用的部分&#xff0c;每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

2024年成都市企业技术标准制(修)订申报条件奖励、材料流程须知

一、2022 年期间奖励项目 (一)申报条件 2022 年期间主导制(修)订并获批发布国际、国家和行业技术标准的工业和信息化企业(其中:民营企业获批发布时间在2022年1月1日至2022年12月31日期间&#xff0c;其他企业获批发布时间在2022年1月1日至2022年7月7日期间)。 (二)支持标准 …

Python | Leetcode Python题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution:def minWindow(self, s: str, t: str) -> str:ans_left, ans_right -1, len(s)left 0cnt_s Counter() # s 子串字母的出现次数cnt_t Counter(t) # t 中字母的出现次数less len(cnt_t) # 有 less 种字母的出现次数…

车路云一体化简介

车路云一体化 车路云一体化融合控制系统&#xff08; System of Coordinated Control by Vehicle-Road-Cloud Integration&#xff0c;SCCVRCI&#xff09;&#xff0c;是利用新一代信息与通信技术&#xff0c; 将人、车、路、云的物理层、信息层、应用层连为一体&#xff0c;…

asp.net不用验证码包,如何实现手写验证码

引文&#xff1a;众所周知&#xff0c;一般我们日常碰到的验证码是一个图形样式的&#xff0c;列入这个样子的&#xff0c;那么在这个图片里面我们想实现我们自己界面上有这样的一个验证码就需要做两个操作&#xff0c;一个是在我们自己界面上生成如图所示的一个验证码图片&…

公司数据防泄漏方案分享|防泄密软件有哪些

企业的数据安全是公司稳定发展的必要条件&#xff0c;如何防止内部数据泄露企业的数据安全是公司稳定发展的必要条件&#xff0c;如何防止内部数据泄露已经成为了一个亟待解决的问题。在这个信息时代&#xff0c;数据已经成为企业最重要的资产之一&#xff0c;因此&#xff0c;…

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …

flutter安卓项目生成MD5、sha1、公钥等

一&#xff1a;MD5、SHA1等生成方式 工具&#xff1a;Android Studio 1. 打开flutter项目下的Android目录 2. 创建signingReport运行配置项 3. build apk&#xff1a; 导航栏->build->Generate Signed App Bundle / APK... 4. 填写存放路径&#xff0c;同时创建文件xx…

了解集合与数据结构(java)

什么是数据结构? 数据结构就是 数据结构, 功能就是描述和组织数据 比如我有10万个QQ号, 我来组织, 有很多种组织方法, 比如链表, 树, 堆, 栈等等. 假如QQ号要查找数据, 有种数据结构查找数据速度很快, 我们就用它 加入QQ号要进行删除数据, 有种数据结构删除速度很快, 我们…