一、联合体的概念
联合
(union)
是一个能在同一个存储空间里
(
但不同时)
存储不同类型数据的复合数据类型。
大致结构如下:
n union foo /* 定义一个联合类型foo */
n {
q int digit;
q double bigfl[10];
q char letter;
n }baz; /* 定义一个example类型的联合变量baz */
二、联合体大小计算规则
联合体大小要至少能容纳最大的成员变量
联合体大小要是所有成员变量类型最大值的整数倍
(注意是类型而不是变量)
因为联合体的存储是在同一个空间里的,所以在存储数据时,它会以里面所占字节数最大的那个数据类型的整数倍来作为整个联合体所占字节数的大小,如,在上面的代码中,联合体里面最大的数据类型是double,所以整个联合体所占字节数是8的整数倍,分析如下图:
在如上联合体中,该联合体共占80个字节。 因为digit是int型变量,占4个字节,而double bigf[10]占80个字节,char占1个字节,所以联合体最小需>=80,而double又是里面最大的数据类型,所以该联合体的大小需为8的整数倍,故该联合体占80个字节,如图:
再如:
union U
{
char s[9];
int n;
double d;
};
该联合体中,char s[9]占1个字节,int n占4个字节,double d占8个字节,首先联合体所占字节数需满足>=9,而因为double是里面最大的数据类型,故该联合体的大小需为double的整数倍,在9和8中,16刚好满足即大余9又是8的整数倍,故所占字节数为16。
所占内存如图:
三、联合体的初始化
联合体的初始化和结构体的类似,如图:
#include <stdio.h>
union IP
{
unsigned char str[4];
unsigned int digit;
};
int main()
{
union IP ip;
printf("Please enter IP address in string format:\n");
scanf("%d.%d.%d.%d",&ip.str[0],&ip.str[1],&ip.str[2],&ip.str[3]);
printf("IP address in digital format is: %u\n",ip.digit);
return 0;
}
但是也有要注意的:
#include <stdio.h>
union test{
int a;
char b;
long c;
}u1;
union s{
int d;
char e;
}u4;
int main(void)
{
//不允许对联合体所有成员进行初始化
// union test u2 = {1,'c',32};
union test u2 = {1};
//如果指定元素初始化,则后面指定的会将前面指定的进行覆盖
union test u3 = {.b = 'c',.a=65};
printf("a = %d\n",u2.a);
printf("b = %d\n",u2.b);
printf("c = %ld\n",u2.c);
printf("a = %d\n",u3.a);
printf("b = %d\n",u3.b);
printf("c = %ld\n",u3.c);
return 0;
}