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

来源:互联网 发布:广发证券交易软件 编辑:程序博客网 时间:2024/05/17 01:35

联合体,几个不同的成员变量共占用同一段内存的结构,也称为共用体。

变量在内存中占的字节数不同,但都从同一地址开始使用,其占用的空间长度为最长成员空间长度。

结构体结构体各成员使用的空间长度连贯长度为各成员长度之和;


联合体提供了从不同角度看待(比如数字和字符间的相互转换)去看同一段内存空间里的内容

即,联合体内的成员是内存的"多种表现方式",但"本质是唯一的”

结构体内的成员变量,不仅表现方式不同,每个变量均有各自的内存空间。

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


原创粉丝点击