结构体和数据结构--共用体

news2024/11/26 16:56:34

        共用体,也称联合(Union),是将不同类型的数据组织在一起共同占用同一段内存的一种构造数据类型。共用体与结构体的类型声明方法类似,只是关键字变为了Union。

例题:演示共用体所占内存字节数的计算方法

#include <stdio.h>
union sample
{
	short i;
	char ch;
	float f;
};

struct ampl
{
	short i;
	char ch;
	float f;
};

typedef union sample SAMPLE;
int main(void)
{
	printf("bytes  = %d\n",sizeof(SAMPLE));
	printf("bytes  = %d\n",sizeof(ampl));
	return 0;
}

 为什么共用体类型和结构体类型占用的内存字节数会如此不同呢?

        这是因为,虽然共用体与结构体都是不同类型的数据组织在一起,但与结构体不同的是,共用体是从同一起始地址开始存放成员的值,即共用体中不同类型的成员共用同一段内存单元,因此必须由足够大的内存空间来存储占据内存空间最多的那个成员,所以共用体类型所占的内存空间的大小取决于其成员中内存空间最多的那个成员变量。

        C语言规定,共用体采用与开始地址对齐的方式分配内存空间。本例中的共用体成员i占2个字节,ch占1个字节,f占4个字节 ,于是f的前1个字节就是为ch分配的内存空间,而前2两个字节就是为i分配的内存空间。共用体使用覆盖技术来实现内存共享,即当对成员f进行赋值操作时,成员i的内容将改变,于是i就失去了其自身的意义,再对ch进行赋值操作时,f的内容又被改变,于是f又失去了其自身的意义。由于同一内存单元再每一瞬时只能存放其中一种类型的成员,也就是说同一时刻只有一个成员是有意义的。因此,在每一瞬时起作用的成员就是最后一次被赋值的成员。

        正因如此,不能为共用体的所有成员同时进行初始化,C89规定只能对共用体的第一个成员进行初始化,但C99没有这个限制,允许按名设置成员的初值。

此外,共用体不能进行比较操作,也不能作为函数参数…………………………

        采用共用体存储程序中逻辑相关但情形互斥的变量,使其共享内存空间的好处是除了可以节省内存空间以外,还可以避免因操作失误引起逻辑上的冲突。例如,在职工数据库库管理中涉及某个人的婚姻状况时,一般有三种可能:未婚,已婚,离婚。任何一个人在同一时间只能处于其中的一种状态。

struct date
{
	int year;
	int month;
	int day;
};

struct marriedstate
{
	struct date marryDay;
	char spouseName[20];
	int child;
};

struct divorceState
{
	struct date divorceDay;
	int child;
};

union maritalState
{
	int single;
	struct marriedState married;
	struct divorceState divorce;
};

struct person
{
	char name[20];
	char sex;
	int age;
	union maritalState marital;
	int marryFlag;
};

         第18~23行定义了一个表示婚姻状况的共用体类型union maritalState,它的3个成员分别表示未婚、已婚、离婚三种婚姻状况。其第2个成员married使用第7~12行定义的已婚结构体类型struct marriedState 来定义(如第21行所示),第3个成员divorce使用第13~17行定义的离婚结构体类型struct divorceState来定义(如第22行所示)。

         第24~31行定义了一个代表职工个人信息的结构体类型struct person,其第4个成员是一个表示婚姻状况的共用体变量,使用第18~23行定义的union maritalState 共用体类型来定义。person-》marryFalg是用来标志婚姻状况的,因为表示婚姻状况的共用体变量有三个,如果不设定标志我们无法得知是使用的哪个。

1--未婚;2--已婚;3--离婚

例题:简易的显示婚姻状况


int main(void)
{
	date birthday ={1991,10,10};
	marriedState married = {{2010,10,30},"吴",2};
	maritalState marry = {0};
	person id = {"赵",'F',35};
	maritalState marital={0};
	id.marryFlag = 2;
//	printf("%d/%d/%d",birthday.year,birthday.month,birthday.day); 
	printf("%s%4c%4d",id.name,id.sex,id.age);
	if(id.marryFlag==2)
	{
		printf("\n");
		printf("//----------------------婚姻状况-----------------------//\n");
		printf("结婚日期:"); 
		printf("%4d%4d%4d",married.marryDay.year,married.marryDay.month,married.marryDay.day);
		printf("\t");
		printf("配偶姓名:");
		printf("%2s",married.spouseName);
		printf("\t");
		printf("子女数量:");
		printf("%d\t",married.child);
	}
}

 

 

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

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

相关文章

如何用手机制作3D人物模型素材

3D人物模型素材是现代3D游戏和电影制作中必不可少的一部分。它们是数字艺术家和设计师们用来创造逼真世界的关键。3D人物模型素材是用计算机程序制作的虚拟人物&#xff0c;可以被用于电影、电视、游戏和虚拟现实应用中。它们可以被用来代替实际演员&#xff0c;也可以被用来创…

小程序蓝牙通信

蓝牙通信能力封装 一开始是根据uniapp提供的蓝牙api写的蓝牙方法&#xff0c;之后发现复用性&#xff0c;以及一些状态的监听存在缺陷&#xff0c;之后整理成了类。这样复用性以及状态监听的问题就解决了。 蓝牙组件 创建蓝牙组件的类 单例模式是为了保证蓝牙长连接&#xff0…

前端(一)——前端开发遇到的普遍问题以及解决策略

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;前端开发遇到的普遍问题以及解决策略 前端十万个为什么&#xff1f; 有人说vue框架是基于mvvm实现的&#xff1f;这种说法对吗&#xff1f; mvc和mvvm的区别是什么&#xff1f; mvvm是否是mvc的升…

内容文本生成二维码用excel表格导出(java)

内容文本生成二维码用excel表格导出(java) //若有问题可留言 效果如下: import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map;import org.apache.po…

大厂股权就是这么“坑”,150万股票到账前被优化,损失惨重

某网友发文称&#xff1a;“自己还有47天就可以解锁股权&#xff0c;到时就有150万的股票到账&#xff0c;结果接到公司裁员通知&#xff0c;实在是淌血&#xff0c;我能反抗吗&#xff1f;” 对这我只能说&#xff0c;公司卡的就是这个点。所以大家在找工作的时候&#xff0c;…

SparkJDBC性能优化指南

前言 本文以Mysql为例。Spark作为一种强大且广泛应用于大数据处理的分布式计算框架,有着出色的性能和可伸缩性。在使用Spark处理大规模数据时,往往需要与关系型数据库MySQL进行交互。然而,由于MySQL和Spark本身的特性之间存在一些差异,直接使用Spark读写MySQL的默认配置可…

SQL 查找重复的电子邮箱

SQL 182 查找重复的电子邮箱 SQL架构 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列。 此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。 编写一个 SQ…

线性DP-入门篇

目录 数字三角形&#xff1a; 最长上升子序列&#xff1a; 魔族密码&#xff1a; 编辑距离&#xff1a; 线性动态规划的主要特点是状态转移的推导是按照问题规模 从小到大依次推导&#xff0c;较大规模的问题的解依赖较小规模的问题的解。 数字三角形&#xff1a; [USA…

大模型是什么

在计算机领域&#xff0c;大模型’是一个近年来备受关注的词汇。这篇文章旨在带你遨游大模型的世界&#xff0c;了解它们的特点、优缺点&#xff0c;以及需如何有效地利用它们。我们还会探讨一些具体的大模型实例&#xff0c;并分析其对人类社会的影响。 首先&#xff0c;我们…

Android Studio实现内容丰富的安卓博客发布平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号078 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看博客列表…

@项目经理:写好简历其实只要2步,保证你offer拿到手软!

早上好&#xff0c;我是老原。 混职场&#xff0c;最重要的是什么&#xff1f;还是能赚到钱。 有人说&#xff0c;重要的是开心。这么说吧&#xff0c;我身边那些赚得多的&#xff0c;没几个不开心的。 很多人赚不到钱&#xff0c;归结为自己能力差&#xff0c;不够努力。 …

年度好用的8款AI绘画工具,第1款一定要看

本文总结了8款2023年年度好用的AI绘画工具&#xff0c;它们结合了最新的技术和创新的设计理念&#xff0c;能帮助设计师将创意变为创作&#xff0c;一起来看看吧&#xff01; 1.即时AI灵感 即时AI灵感作为一款国产的AI绘图工具&#xff0c;采用了先进的自然语言处理和图像生成…

前端学习——jsDay2

运算符 赋值运算符 一元运算符 比较运算符 逻辑运算符 小练习 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name…

chatgpt实现NLP基本任务(实体识别、关系抽取、属性抽取、事件抽取、文本分类)

文章目录 前置&#xff1a;基础函数一、实体识别二、关系抽取三、属性抽取四、事件抽取五、文本分类六、可能存在的问题&#xff08;报错&#xff09; 前置&#xff1a;基础函数 import openai import time from tqdm import tqdmdef chatgpt_function(content, keyNone):open…

前端学习——jsDay1

Day1 JavaScript是什么&#xff1f; 实现点击按钮改变颜色 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"…

vue 移动端开发vw适配方案rem适配方案 + vant框架 + unocss|tailwindcss

写在前面的话&#xff1a;看了这篇文章&#xff0c;有些东西名词啥的不懂的&#xff0c;或者有疑问的推荐百度&#xff0c;因为写的太多真的显得很啰嗦&#xff01; 1.移动端开发适配 目前移动端适配&#xff0c;在市面上主流适配方案无非就两种&#xff0c;rem方案和vw方案。…

大禹智库:下一代向量数据库————具备在线化,协作化,可视化,自动化和安全互信的向量数据库

目录 一、在线化 二、协作化 三、可视化 四、自动化 五、安全互信 结论&#xff1a; 行业分析报告&#xff1a;下一代向量数据库的特征 摘要&#xff1a; 向量数据库是一种用于存储和处理向量数据的数据库系统。随着人工智能和大数据技术的快速发展&#xff0c;向量数据…

原生js实现for循环占位符绑定数据,类似模拟vue循环渲染数据

let ar [{ label: 显示文本1, value: 1 },{ label: 显示文本2, value: 2 },{ label: 显示文本3, value: 3 },{ label: 显示文本4, value: 4 },{ label: 显示文本5, value: 5 },], html , tpl <p>{value}&#xff1a;{label}</p>, dom document.querySelector(&…

MySQL安装及使用图文教程(超详细版本)

1、下载 下载地址&#xff1a;MySQL :: Download MySQL Installer 本文选择安装包安装版本 2、 安装 1&#xff09;双击安装包启动安装程序&#xff0c;点击“Next”按钮&#xff0c;如下图&#xff1a; 2&#xff09;点击“Execute”按钮 3&#xff09;点击“Next”按钮 4&a…

PHP 校园新闻网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 校园新闻网站系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址https://download.csdn.net/download/qq_41221322/87999771https://downlo…