但不能只引用共用体变量,例如 printf("%d", a); 是错误的,因为 a 的存储区有好几种类型,分别占不同长度的字节,仅写共用体变量名 a ,难以使系统确定究竟输出的哪一个成员的值。
共用体类型数据的特点在使用共用体类型数据时,应当注意以下一些特点:
同一个内存段可以用来存放几种不同类型的成员,但在 每一瞬时只能存放其中一种 ,而 不是同时存放几种 。也就是说,每一瞬时只有一个成员起作用,其它的成员不起作用,即:共用体中的成员不是同时都存在和起作用的。
共用体变量中起作用的成员是 最后一次 存放的成员,在存入一个新的成员后,原有的成员就失去作用了。例如有如下赋值语句:
a.i = 1; a.c = 'F'; a.f = 2.5;
在执行完以上 3 条赋值语句后,此时只有 a.f 是有效的,而 a.i 和 a.c 已经无意义了。因此在引用共用体变量的成员时, 程序员 自己必须十分清楚当前存放在共用体变量中的究竟是哪个成员。
共用体变量的地址和它的各成员的地址都是同一地址,例如 &a 、 &a.i 、 &a.c 、 &a.f 都是同一个地址值,其原因是显然的。
不能直接对共用体变量名赋值,也不能企图引用变量名来得到一个值,同时也不能在定义共用体变量时对它初始化。例如,以下这些都是不对的:
union { int i; char c; float f; } a = {1, 'a', 1.5}; // 不能对共用体初始化 a = 1; // 不能对共用体变量赋值 m = a; // 不能引用共用体变量名以得到一个值
不能把共用体变量作为函数参数,也不能使函数返回共同体类型的变量,但可以使用指向共用体变量的指针(与结构体变量的指针用法类似,不再赘述)。
共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。
共用体总感觉像是计算机发展早期,内存寸土寸金的遗留产物。
总结本文简要介绍了 C 语言中结构体和共用体的概念及其应用,如有不当之处,欢迎指出,更多细节强烈推荐阅读谭浩强主编的《C 程序设计》教材这两本书,你将会有更多收获。
《C 程序设计》可从以下信息得到下载:
------------------------------------------分割线------------------------------------------
也可以到Linux公社1号FTP服务器下载
FTP地址:ftp://ftp1.linuxidc.com
用户名:ftp1.linuxidc.com
密码:
在 2019年LinuxIDC.com//1月/C 语言中的结构体和共用体(联合体)/
------------------------------------------分割线------------------------------------------
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx