共用体,及与结构体的比较

1.编译器会为结构体变量中的每个数据成员分配不同的地址空间,编译器为共用体分配的是同一块内存,每个时刻只用一个数据成员有意义。

  • 共用体:节约内存
  • 共用体占用字节长度,取共用体中字节最长的成员。 几个成员共用一片内存。

2.共用体任何时侯只会出现其体内变量中的一个。
3.结构体成员的地址不同,共用体的每一个成员地址相同。


4.若变量不再同一时刻出项,可以用共用体来存储他们。
5.共用体宽度(字节数)就是最长的那个,但是必须能够整除最宽基本类型成员,若是不够则补充。
6.两者取最短也适用于共用体。

两者关于typedef:

typedef unsigned long int num1,num2,num3;    //三个都是类型名。
typedef union myunion
{
    int num;
    double db;
}a,b;    //a,b 都是类型名

 a a1 = {.db = 11.9};    //对结构体或者共用体中的指定成员赋值

 **** 改变一个变量就会影响整个共用体。
union pc pc1 = { 20 };
union pc pc[3] = { {20}, {20}, {20}}; //数组初始化的一般形式,变量名与类型名可以重名。
union pc *p = (union pc []){ {20}, {20}, {20}};  
union Myunion m1,m2;

  • 共用体不能引用共用体变量,只能引用其成员。
  • 共用体变量中起作用的成员是最后一次存放的成员。


union Myunion un2 = un1; //浅拷贝
深拷贝,自己分配内存,然后复制。
un2.p = moloc(100);
strcpy(un2.p,un1.p);


  • 结构体中可以用共用体,也可以共用体中有结构体,但是两个不能相会嵌套。
原文地址:https://www.cnblogs.com/sjxbg/p/5705485.html