首先我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union)。
union 共用体名
{
数据类型 成员变量;
数据类型 成员变量;
}
结构体与共用体的主要区别在于存储方式的不同:
结构体在定义后,声明变量时系统为该变量申请内存空间为所有成员变量所占用的内存空间之和。
成员所占用得空间与4字节进行比较,若都小于4字节,则按4字节一块进行开辟,开辟得空间为4的倍数。若有成员所占字节大于4,则按最大成员所占字节数为开辟空间,例有成员double,则开辟的空间为8的倍数
共用体变量声明时,变量占有空间不变,在同一时间,只能存储某一个成员的信息。
共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体内存详解:
共用体变量和其中的各个成员变量为同一地址,共用体变量存储的为地址。若对其中的变量赋值,用.赋值法进行赋值。
借用如图
ch类占一个存储空间,m占两个存储空间,n占4个存储空间。
若先修改n,再修改ch时,ch空间发生改变,n的第一个字节也会发生改变即,使用同一存储空间,起始位起始地址的空间地址。
练习:
定义一个val_t类型的变量a,对a的f_val进行赋值,然后打印f_val成员的值。
定义一个变量val_t类型的变量b,将a的值赋给变量b。
比较变量a和变量b的值是否相等(如果是结构体呢?)。
代码:
#include<stdio.h>
typedef int BOOL;
union val_t
{
BOOL b_val;//bool类
int i_val;//整形
float f_val;//浮点型
};
int main(int argc, char const *argv[])
{
union val_t a;
a.f_val=1.38;
printf("f_val的值为:%f\n",a.f_val);
union val_t b;
b=a;
printf("b的值为:%p\n",b);
printf("a的值为:%p\n",a);
return 0;
}
结果: