探讨C语言中的“联合“类型
Posted 天“码”行空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探讨C语言中的“联合“类型相关的知识,希望对你有一定的参考价值。
前面我们知道C语言在定义一个变量时,往往会为定义的变量分配一段内存空间。但是C语言有一个特殊功能,可以使多个变量共享同一个内存。这个功能可以通过联合来实现。那么什么是联合呢?
一.联合
联合:在C语言中允许多个不同变量共享同一内存区域的功能称为联合。
假如现在我要定义三个变量共享的一个联合,也就是三个变量同属同一内存区域,应该怎么定义呢?
union unnode
int n;
double a;
char c1;
u;
现在我们来看上述代码,你发现它与那一种类型很相似呢?对的,从其结构上看,与我们所学的结构模板极为相似。最明显其头部的关键字不一样,结构的关键字是struct,而联合的关键字是union(就是联合的英文单词)。其次你会发现,3个变量n,a,c1的数据类型不同,也就是说不同数据类型的变量也可以联合起来,共享同一内存,不一定非要都是同一数据类型。分号前的u表示定义一个联合变量。即在声明联合时定义联合变量,这一点与我们前面所说的定义结构类型时定义结构变量是相通的。当然也可以这样定义:union unnode u;
刚才我们说了,所谓联合就是不同变量占同一内存空间,那么编译系统如何为联合变量分配内存空间呢?如char型占一个字节,int型占4个字节,double型占8个字节。那么在上例中,编译系统为上述联合变量分配几个字节的内存空间呢?C语言规定,编译器按联合的成员中最长的那一个类型为联合变量分配存储空间,所以为u分配8个字节,其中u.n占前4个字节,u.a占全部8个字节,u.c1占前一个字节。由于同一内存单元在每一个瞬间只能存放其中一种类型的成员,也就是说同一时刻只有一个成员是有意义的,因此在每一瞬间起作用的成员就是最后一次被赋值的成员。基于此,不能为联合的所有成员同时进行初始化,只能对第一个成员初始化。
记住:联合成员的访问与结构成员的访问一模一样。
//定义一个联合类型,用其声明变量,为变量赋值后输出各成员的值
#include<stdio.h>
union share
float decval;
int pnum;
double my_value;
u;
int main(void)
u.my_value = 125.5;
u.pnum = 10;
u.decval = 1000.5f;
printf("\\ndecval=%f pnum=%d my_value=%lf",u.decval,u.pnum,u.my_value);
printf("\\nu size=%d\\ndecval size=%d pnum size=%d my_value
size=%d",sizeof(u),sizeof(u.decval),sizeof(u.pnum),sizeof(u.my_value);
return 0;
运行结果
decval=1000.500000 pnum = 1148854272 my_value = 125.500016
u.size=8;
decval size=4 pnum size=4 my_value size=8
总结:由输出结果可以看出,只有最后一个变量的值是正确的,其它两个都是错的,这是因为他们共享同一块内存空间。
二.联合指针
定义联合指针可以用下列语句:
union unode *p;
有了指针后,就可以修改联合的成员。如下语句:
p = &u; u1.a = p---->a;
三.联合的初始化
只能用和联合中第一个变量相同类型的常量初始化。
四.联合和结构
结构和数组可以是联合的成员,反之联合也可以是结构的成员。对此要合理结合结构和联合,这样可以定义出各种各样能满足实际需要的数据类型。
以上是关于探讨C语言中的“联合“类型的主要内容,如果未能解决你的问题,请参考以下文章