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

【C语言入门教程】7.4 共用体

7.4 共用体

共用体又称为联合体,是由不同的数据类型组成的一个整体。与结构体不同的是,共用体每次只能使用其中一个成员。结构体的总长度是结构体所有成员长度之和,共用体的总长度是其中最长一个数据类型的长度,共用体的所有成员共享这一存储空间。在一些场合中,只需要使用某一类型的变量而其他类型的变量暂时不需要使用。当使用另一类型变量时,原先的变量也转为与程序无关,这种情况下可使用共用体节省同时存在多种数据类型变量所需要的额外空间。

 

7.4.1 共用体的定义

定义共用体使用修饰符 union,一般形式是:

union 共用体名
{
    成员列表
};

共用体名是该共用体独一无二的名称,命名规则与变量命名相同。成员项列表是共用体中数据成员的数据类型和名称,数据成员可以是变量、数组或者其他结构体等复合数据结构,各成员通常不使用相同的数据类型。成员项列表的一般形式为:

数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;

使用共用体声明变量的一般形式为:

union 共用体名 共用体变量名;

该语句只能在共用体定义后出现。如下例所示:

union unidate
{
    char a;
    int b;
    long c;
    doubule d;
};
union unidate x;

共用体成员中,长度最长的是双精度浮点型 d,共用体变量 x 的长度为双精度浮点型数据类型的长度。

 

7.4.2 共用体变量的引用

共用体变量的引用方式与结构体变量相同,一般形式为:

共用体名.成员名

但共用体一次只能使用一个成员,如下例所示:

#include <stdio.h>

int main(void)
{
	union unidate		// 共用体名
	{
		char a;			// 共用体成员
		int b;
		long c;
		double d;
	};

	union unidate x;			// 声明共用体变量
	x.a = 65;					// 为成员 a 赋值
	printf("x.a = %c\n", x.a);

	x.b = 100;
	printf("x.b = %d\n", x.b);	// 为成员 b 赋值

	x.c = 10005000;				// 为成员 c 赋值
	printf("x.c = %ld\n", x.c);

	x.d = 0.69314718056;		// 为成员 d 赋值
	printf("x.d = %f\n", x.d);

	printf("x.a = %c\n", x.a);	// 再次输出成员 a,这时成员 a 已经没被使用

	return 0;
}

该程序的输出结果为:

x.a = A
x.b = 100
x.c = 10005000
x.d = 0.693147
x.a = 

最后一次输出的结果为不可预知的,因为共用体 x 的存储空间中已经被成员 x.d 使用过,而输出成员 x.a 前,没有重新为成员 x.a 赋值,这时如果引用成员 x.a 的数据,获得的是成员 x.d 的一部分数据,所以输出结果可能因系统环境的不同而有差异。

转载于:https://www.cnblogs.com/52php/p/5681804.html

相关文章:

  • Android Snackbar
  • Eclipse代码自动提示设置
  • php代码审计--sql注入
  • Android开发技术周报 Issue#89
  • mysql关联表的复制
  • 【贪心】电视节目安排
  • zynq基础--verilog简易规则
  • 算法学习总结(二):选择排序
  • POJ - 1287 Networking
  • 【iOS】Jenkins Gitlab持续集成打包平台搭建
  • MySQL性能优化的最佳21条经验【转载】
  • 游戏引擎
  • Python的pip安装
  • 电Call记录统计查询sql
  • 数组操作
  • C++类的相互关联
  • docker-consul
  • EventListener原理
  • JAVA SE 6 GC调优笔记
  • java 多线程基础, 我觉得还是有必要看看的
  • Java基本数据类型之Number
  • js学习笔记
  • PAT A1050
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue-router 实现分析
  • 成为一名优秀的Developer的书单
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 汉诺塔算法
  • 来,膜拜下android roadmap,强大的执行力
  • 算法-插入排序
  • NLPIR智能语义技术让大数据挖掘更简单
  • 湖北分布式智能数据采集方法有哪些?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​马来语翻译中文去哪比较好?
  • #include到底该写在哪
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (c语言)strcpy函数用法
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (简单) HDU 2612 Find a way,BFS。
  • (十)c52学习之旅-定时器实验
  • (转)jdk与jre的区别
  • (转)Linq学习笔记
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Sql Server 保留几位小数的两种做法
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • /var/spool/postfix/maildrop 下有大量文件
  • @ConditionalOnProperty注解使用说明
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构