结构体与联合体的用法

来源:互联网 发布:三菱plc模拟软件 编辑:程序博客网 时间:2024/05/01 10:16

我觉得联合体的优点从另一方面来讲就是缺点:  
1、使用联合体可以节省空间.
有时我们需要一种类型即能保存整型数,又能保存浮点数.
这时如果定义成结构体类型, 如:  
typedef struct {
  int i;
  float f;
} Number;
当使用该结构体来存储整型数或浮点数时,这样很明显会造成内存浪费。
同样的需求,如果用联合体来定义,如:
typedef union {
  int i;
  float f;
} Number;
定义一个联合体类型变量:
Number u;
当需要保存整型数时,可以将整型数保存到联合体的i成员中,  
u.i = 10;
后面又需要保存浮点数时,可以写成:
u.f = 70.8;
由于联合的成员重叠存储,那么当后面一条赋值语句执行完后,将抹去前面保存在联合体成员i里的值.
如果后面需要测试u.i的值,那么它会显示出无意义的内容.这样容易造成混淆.
2、使用联合可以用来构造混合的数据结构.
如用上面的联合体类型来定义一个数组,  
Number number_arr[100];
这个数组中的元素既能保存整型数,用能保存浮点数.
由于联合体同一时间内只能保存一种类型的成员,因此没有简便的方法可以表明联合最后的成员,前面已经指出, 当联合体中元素类型不正确时,甚至会出现无意义的情况.
这个问题的一个解决方案是为结构添加一个标记字段, 结构中包含联合体, 如:
typedef struct {
  int flag;
  union {
    int i;
    float f;
  }
} Number;
当flag为0时,表示为联合体中保存的元素为整型数;flag=1时,表示联合中保存的为浮点数;
每次更新结构中联合元素保存的类型时,都需要更新结构体中的标记变量.
这样比一般的更新方式要多一步的操作。
同时,标记字段也需要占用空间,有时候这样做,可能会占浪费更多的空间.