版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_39286218/article/details/78649411
联合体,几个不同的成员变量共占用同一段内存的结构,也称为共用体。
变量在内存中占的字节数不同,但都从同一地址开始使用,其占用的空间长度为最长成员空间长度。
而结构体结构体各成员使用的空间长度连贯,长度为各成员长度之和;
联合体提供了从不同角度看待(比如数字和字符间的相互转换)去看同一段内存空间里的内容
即,联合体内的成员是内存的"多种表现方式",但"本质是唯一的”。
而结构体内的成员变量,不仅表现方式不同,每个变量均有各自的内存空间。
#include <stdio.h>
union un{
int i;
short int si[2];
char c[4];
};
int main(){
union un x;
x.c[0]='A';
x.c[1]='B';
x.c[2]='C';
x.c[3]='D';
printf("%c, %c, %c, %c\n", x.c[0], x.c[1], x.c[2], x.c[3]);
printf("%d, %d\n", x.si[0], x.si[1]);
printf("%d\n", x.i);
return 0;
}
这也意味着对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,
即,内存单元里面的内容变化,各种表现形式也会跟着变化。
而对于struct的不同成员赋值是互不影响的。
union myun{
struct { int x; int y; int z; }u;
int k;
}a;
int main(){
a.u.x =4;
a.u.y =5;
a.u.z =6;
a.k = 0;
printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
return 0;
}
union应用:
假设网络或控制协议中需要传送三种报文,其格式分别为packetA、packetB、packetC:
struct structA{
int a;
char b;
};
struct structB{
char a;
short b;
};
struct structC{
int a;
char b;
float c;
}
在真实的通信中,每次只能发三类报文中的一种,我们可以将三类报文的结构体组织为一个union(共享一段内存,但每次有效的只是一种),然后和报文类型字段统一组织成一个报文数据结构。
struct CommuPacket{
int iPacketType; //报文类型标志
union{ //每次传送的是三种报文中的一种,使用union
struct structA packetA;
struct structB packetB;
struct structC packetC;
}
};