C语言union共用体的用法(附带实例)
共用体(union)也称为联合体,看起来很像结构体,只不过关键字由 struct 变成了 union。
共用体和结构体的区别在于,结构体定义了一个由多个数据成员组成的特殊类型,而共用体定义了一块被所有数据成员共享的内存,可使几种不同类型的变量存放到同一内存单元中。
定义共用体变量有以下 3 种方式:
1) 先声明共用体类型,再定义变量。一般形式如下:
2) 声明共用体类型的同时定义变量。一般形式如下:
3) 直接定义共用体变量。一般形式如下:
共用体和结构体的区别在于,结构体定义了一个由多个数据成员组成的特殊类型,而共用体定义了一块被所有数据成员共享的内存,可使几种不同类型的变量存放到同一内存单元中。
定义共用体变量有以下 3 种方式:
1) 先声明共用体类型,再定义变量。一般形式如下:
union 共用体名 { 成员列表; }; //定义共同体类型 union 共用体名 变量名; //定义共用体变量例如:
union DataUnion { int iInt; char cChar; float fFloat; }; union DataUnion variable; /*定义共用体变量*/
2) 声明共用体类型的同时定义变量。一般形式如下:
union 共用体名 { 成员列表; }变量名;例如:
union DataUnion { int iInt; char cChar; float fFloat; }variable; /*定义共用体变量*/
3) 直接定义共用体变量。一般形式如下:
union { 成员列表 }变量名;例如:
union { int iInt; char cChar; float fFloat; }variable; /*定义共用体变量*/可以看到,共用体定义变量的方式与结构体定义变量的方式很相似。要注意的是,结构体变量的大小是其所包括的所有数据成员大小的总和,其中每个成员分别占有自己的内存单元;而共用体的大小取决于所包含的数据成员对应的最大内存的大小。
共用体的使用
共用体变量定义完成后,就可以引用其中的成员数据来进行使用。使用的一般形式如下:共用体变量.成员名;例如,使用前面定义的 variable 变量中的成员数据,代码如下:
variable.iInt; variable.cChar; variable.fFloat;
【实例】将玻璃罐头瓶设为一个共用体,这个罐头瓶可以装桃,可以装椰子,也可以装山楂。在本实例中定义共用体变量,通过定义的函数使用共用体中的数据成员。具体代码如下:注意,不能直接使用共用体变量,如“printf("%d",variable);”的写法是错误的。
#define _CRT_SECURE_NO_WARNINGS #include "stdio.h" /*包含头文件*/ #include<string.h> /*声明桃结构体*/ struct peaches { char name[64]; }; /*声明椰子结构体*/ struct coconut { char name[64]; }; /*声明山楂结构体*/ struct hawthorn { char name[64]; }; /*声明罐头共用体*/ union tin { struct peaches p; struct coconut c; struct hawthorn h; }; int main() /*主函数main()*/ { union tin t; /*定义一个共用体*/ strcpy(t.p.name, "桃"); /*将相应的名字复制给相应的变量*/ strcpy(t.c.name, "椰子"); strcpy(t.h.name, "山楂"); printf("这个罐头瓶装%s\n", t.p.name); /*输出信息*/ return 0; /*程序结束*/ }运行程序,结果为:
这个罐头瓶装山楂
总结
在使用共用体类型时,需要注意以下几点:- 同一内存可以用来存放几种不同类型的成员,但是每一次只能存放其中一种,而不是同时存放所有类型的成员。也就是说在共用体中,只有一个成员起作用,其他成员不起作用。
- 共用体变量中起作用的成员是最后一次存放的成员,存入一个新的成员后原有的成员就失去作用。
- 共用体变量的地址和它的各成员的地址是一样的。
- 不能对共用体变量赋值,也不能引用变量名来得到一个值。