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);
- 结构体中可以用共用体,也可以共用体中有结构体,但是两个不能相会嵌套。