C语言进阶-第30讲:联合体及其与结构体的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 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应用:

假设网络或控制协议中需要传送三种报文,其格式分别为packetApacketBpacketC

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;  
    }  
};


猜你喜欢

转载自blog.csdn.net/sinat_39286218/article/details/78649411