共用体详解

1 共用体的概念

有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中(见图11.24)。以上3个变量在内存中占的字节数不同,但都从同一地址开始(图中设地址为1000)存放。也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为共用体”类型的结构。

定义共用体类型变量的一般形式为

union }共用体名

{成员表列

}变量表列;

例如:

union data

{int i; 

char ch;

float f;}

a,b,c:

也可以将类型声明与变量定义分开:

union data

{int i;

char ch;

float f;

};

union data a,b.c;

即先声明一个union data类型,再将a、b、c定义为 union data类型。当然也可以直接定义共用体变量,如:

Union

{int i;

char ch;

float f;

}a,b,c;

可以看到,“共用体”与“结构体”的定义形式相似。但它们的含义是不同的。

结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。

共用体变量所占的内存长度等于最长的成员的长度。例如,上面定义的“共用体”变量 a、b、c各占4个字节(因为一个实型变量占4个字节),而不是各占2+1+4=7个字节。

国内有些C语言的书把union直译为“联合”。作者认为,译为“共用体”更能反映这种结构的特点,即几个变量共用一个内存区。而“联合”这一名词,在一般意义上容易被理解为“将两个或若干个变量联结在一起”,难以表达这种结构的特点。日本就是用“共用体”这一术语的。但是读者应当知道“共用体”在一些书中也被称为“联合”。在阅读其他书籍时如遇“联合”一词,应理解为“共用体”。

2 共用体变量的引用方式

只有先定义了共用体变量才能引用它。而且不能引用共用体变量,而只能引用共用体变量中的成员。例如,前面定义了a、b、c为共用体变量,下面的引用方式是正确的:

a.i (引用共用体变量中的整型变量i)

a.ch (引用共用体变量中的字符变量ch)

a.f (引用共用体变量中的实型变量f)

不能只引用共用体变量,例如:

printf(" %d" ,a)

是错误的,a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a:难以使系统确定究竟输出的是哪一个成员的值。应该写成printf(" %d" ,a. i)或print("%c",a.ch)等。

3 共用体类型数据的特点

在使用共用体类型数据时要注意以下一些特点:

(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。也就是说,每一瞬时只有一个成员起作用,其他的成员不起作用,即不是同时都存在和起作用。

(2)共用体变量中起作用的成员是最后一次存放的成员,在存人一个新的成员后原有的成员就失去作用。如有以下赋值语句:

a.i=1;

a.c='a';

a.f=1.5;

在完成以上3个赋值运算以后,只有a.f是有效的,a.i和a.c已经无意义了。此时用 prntf(" %d",a.i)是不行的,而用printf("%f",a.f)是可以的,因为最后一次的赋值是向.I赋值。因此在引用共用体变量时应十分注意当前存放在共用体变量中的究竟是哪个成员。

(3)共用体变量的地址和它的各成员的地址都是同一地址。例如:&a.&a.i,&a.c、 la.都是同一地址值,其原因是显然的。

(4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。例如,下面这些都是不对的:

union

{int i;

char ch; 

float f;

)a={1,'a',1.5); (不能初始化)

②=1; (不能对共用体变量赋值)

③m=a; (不能引用共用体变量名以得到一个值)

(5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体变量这种用法相仿)。

(6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

例11.12 设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中,见图11.25。如果“job”项为”s”(学生),则第5项为class(班)。即Li是501班的。如果“job”项是“t”(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将calss和position 放在同一段内存中)。

num

name

sex

job

class(班)

Position(职务)

101

Li

f

s

501

102

Wang

m

t

prof

                                                        图11.25

要求输入人员的数据,然后再输出。可以写出下面的算法(见图11.26)。按此写出程序。为简化起见,只设两个人(一个学生、一个教师)。

struct

{int num;

char name[10];

char sex;

Union

{int class;

char position[10];

}category;

}person[2];

main()

{int n,i;

for(i=0;i<2;i++)

{scanf("%d %s %c %c" , &person[i]. num,person[i].name, & person[i].sex,&person[i].job);

If{person[i].job= ='s') scanf("%d",& person[i]. category.class);

else if ( person[i].job=='t') scanf("%s" , person[i]. category.position) ;

else printf("input error!");

}

printf("\n");

printf("No. Name sex job class/position\n");

for(i=0;i<2;i++)

{if(person[i].job=='s')

printf("%-6d %-10s %-3c %-3c %-6d\n",person[i]. num,person[i].name, person[i].

sex,person[i].job,person[i],category.class);

else

printf("%-6d %-10s %-3e %-3e %-6s\n", person[i]. num,person[i]. name, person[i].

sex, person[i].job,person[i],category, position);

运行情况如下:

101 Lils 501↙

102 Wang m t professor↙

No. Name  sex job class/position

101 Li f s 501

102   Wang m   t professor

可以看到:在main函数之前定义了外部的结构体数组person,在结构体类型声明中包括了共用体类型,category(分类)是结构体中一个成员名,在这个共用体中成员为calss和position,前者为整型,后者为字符数组(存放“职务”的值一字符串)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“数据持久化”和“缓存与数据库不一致”到底有什么区别?

之前&#xff0c;我一直把“数据持久化”和“缓存与数据库不一致问题”给搞混了。我当时复习的时候基本上就没有思考&#xff0c;就是纯背诵&#xff0c;数据持久化是什么&#xff0c;数据持久化有两种方式&#xff0c;这两种方式特点是什么&#xff0c;然后巴拉巴拉一堆。缓存…

LC 100.相同的树

100. 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a; p [1,2,3], q [1,2,3] 输出&#xff1…

【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

目录 前言 1、文件目录 2、安装依赖 3、POM项目实战-案例&#xff1a;打开指定页面 目录结构&#xff1a; pages中的代码&#xff1a; cases中的代码&#xff1a; 4、解决登录问题 问题&#xff1a; 解决方案&#xff1a; 获取登录的用户信息&#xff08;cookie&a…

GTC 2024 火线评论:DPU 重构文件存储访问

编者按&#xff1a;英伟达2024 GTC 大会上周在美国加州召开&#xff0c;星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论&#xff0c;继上一篇《GTC 2024 火线评论&#xff1a;GPU 的高效存储利用》之后&#xff0c;这是他发回的第二篇评论文章。 上一篇文章…

数据意外变化导致条件判断流程异常

1. 问题描述 用户使用的 MCU 型号是 STM32H750VB。 在客户的代码中有多个条件语句&#xff0c;在条件里面的变量数值没有变化的情况下执行了条件里面的逻辑。 有点类似如下 C 语句 : If(变量 A !0) {//执行一些指令 }即变量 A 在明明没有变化且条件不满足的情况下, 程序运行时…

程序员卷王的简历

这真是一份淋漓尽致、低入尘埃、舔到骨髓的优势。 但从一个hr的角度来看&#xff0c;依然有可以继续提升的地方。 比如&#xff1a; 优势第一条本身就有问题&#xff0c;不懂劳动法&#xff1f;你怎么还会有劳动法这个概念&#xff01;你知道“劳动法”本身&#xff0c;这个…

自动采集实时海量主流电商平台API数据接口,让你拥有一手绝对好牌!

前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。 平时需要从某些电商网站上抓取数据&#xff0c;那么这里以淘宝为示例给大家演示。这…

selenium元素定位--xpath定位--层级与逻辑组合定位

其他元素非唯一时&#xff0c;又不想用xpath绝对定位时&#xff0c;需要用到层级与逻辑定位. 一、层级属性结合定位&#xff1a; 遇到元素没有class、name、id等或属性动态变化情况时&#xff0c;可以找父节点元素&#xff0c;父级节点没有id时&#xff0c;可以继续往上找id&…

HeidiSQL导出SQL文件

目前开发阶段的数据库可视化工具逐渐转为了HeidiSQL&#xff0c;本文讲一讲导出到sql文件的小细节&#xff0c;给自己做个记录补充。 安装或数据库可视化工具比较可参考&#xff1a; windows下全免费手动搭建php8mysql8开发环境及可视化工具安装 导出 原来用Navicat的时候&am…

git下载安装教程

git下载地址 有一个镜像的网站可以提供下载&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/图太多不截了哈哈&#xff0c;一直next即可。

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节&#xff0c;包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时&#xff0c;尤其是面对海量数据时&#xff0c;需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议&#xff1a; 请求示…

基于 MCSDK5.4.8 电机库修改两电阻采样方法

1. 前言 在当前使用的电机电阻采样方式中分为单电阻&#xff0c;双电阻&#xff0c;三电阻三种方式&#xff0c;其中在 ST MCSDK5.4 库中支持了两种采样方式&#xff0c;单电阻和三电阻&#xff0c;在市面还存在另外一种采样方式&#xff0c;即双电阻采样&#xff0c;本文讨论…

机器学习:数据降维主成分分析PCA

一、引言 1.数据分析的重要性   在当今的信息爆炸时代&#xff0c;数据已经渗透到各个行业和领域的每一个角落&#xff0c;成为决策制定、科学研究以及业务发展的重要依据。数据分析则是从这些数据中提取有用信息、发现潜在规律的关键手段。通过数据分析&#xff0c;我们能够…

【QGIS基于边界裁剪DEM】

文章目录 1、前言2、操作步骤 1、前言 QGIS内置的栅格裁剪工具&#xff08;如Raster Clipping&#xff09;操作简便&#xff0c;允许用户使用矢量图层作为裁剪掩膜&#xff0c;灵活定义裁剪区域。基于QGIS对相关数据依据边界进行裁剪&#xff0c;可以更好地进行数据可视化展示…

iOS - Runtime - Class-方法缓存(cache_t)

文章目录 iOS - Runtime - Class-方法缓存(cache_t)1. 散列表的存取值 iOS - Runtime - Class-方法缓存(cache_t) Class内部结构中有个方法缓存&#xff08;cache_t&#xff09;&#xff0c;用散列表&#xff08;哈希表&#xff09;来缓存曾经调用过的方法&#xff0c;可以提高…

车载以太网AVB交换机 TSN交换机 时间敏感网络 6端口 百兆 SW100TSN

SW100 TSN时间敏感网络AVB交换机 为6端口百兆车载以太网交换机&#xff0c;其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100/1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现纳米级时间同步&#xff0c;车载以太网多通道交换&#xff0c;Bypass数据采集和监控等功能&…

深度学习中常用计算距离的几种算法对比与python实现

前言 距离度量在许多机器学习算法中扮演着至关重要的角色&#xff0c;无论是监督学习还是无监督学习。选择适当的距离度量可以显著影响模型的性能。 在高维数据集中&#xff0c;欧几里得距离可能会受到所谓的“维度诅咒”的影响&#xff0c;因为随着维度的增加&#xff0c;数…

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)–问题分析 在使用alarm函数进行序号处理测试的时候发现如果把输出重定向到文件里面会导致信号的处理出现严重的延迟(ubuntu18) #include <stdio.h> #include <stdlib.h> #include <unist…

API成网络攻击常见载体,如何确保API安全?

根据Imperva发布的《2024年API安全状况报告》&#xff0c;API成为网络攻击者的常见载体&#xff0c;这是因为大部分互联网流量&#xff08;71%&#xff09;都是API调用&#xff0c;API是访问敏感数据的直接途径。根据安全公司Fastly的一项调查显示&#xff0c;95%的企业在过去1…