探讨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语言中的“联合“类型的主要内容,如果未能解决你的问题,请参考以下文章

C语言自定义数据类型中的结构体,枚举,联合详解

C语言中的结构体和共用体(联合体)

C语言的联合出错

C语言的结构和联合,以及PHP是怎么实现弱类型的

C语言中的(uint32)1<<10 是啥意思?

c语言 联合和枚举