目录
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
《C 语言编程 — 高级数据类型 — 数组》
《C 语言编程 — 高级数据类型 — 字符串》
《C 语言编程 — 高级数据类型 — 枚举》
《C 语言编程 — 高级数据类型 — 结构体与位域》
共用体
共用体是一种特殊的数据类型,允许在相同的内存空间存储不同的数据类型。共用体具有多个成员,但同一时刻只能有一个成员被赋值。共用体提供了一种使用相同的内存空间的有效方式。
- 共用体变量包含的成员都占用同一块内存空间。各成员使用同一个起始地址。但在某个瞬间,只能有一个成员生效,即内存空间同一时间只会存放一个成员的数据值。
- 共用体变量中的一个成员被赋值后,原有变量成员的数据就会被冲掉。若连续为各个成员进行赋值,那么只有最后一个被赋值的成员的数据值有效。
- 共用体变量不能作为函数参数,函数也不能返回联合体类型,但指向共用体变量的指针变量可以作为函数参数,函数也可以返回共用体类型指针变量。
定义共用体
使用 union 关键字定义共用体类型:
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
- union tag 是共用体类型的标识(共用体名称),为可选。
- member definition 是标准的变量定义,比如
int i;
。 - 在共用体定义的末尾,可以指定若干个共用体类型变量,也是可选的。
union Data {
int i;
float f;
char str[20];
} data;
现在,Data 共用体类型的变量可以存储一个整数、或一个浮点数,或一个字符串,这些数值都会存储在同一个内存空间,但同一时刻只会有一个数值存在,共用体占用的内存空间为共用体中最大的成员的空间。可以根据需要在一个共用体内使用任何内置的或用户自定义的数据类型。
下面的实例显示共用体占用的总内存大小:
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
printf("Memory size occupied by data : %lu
", sizeof(data));
return 0;
}
访问共用体成员
依旧是使用成员访问运算符 .
。
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
data.f = 220.5;
strcpy(data.str, "C Programming");
printf("data.i : %d
", data.i);
printf("data.f : %f
", data.f);
printf("data.str : %s
", data.str);
return 0;
}
运行:
$ ./main
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
上述可见 data.i
和 data.f
的数值被损坏了,这是因为最后赋值的共用体变量成员 str 将 i 和 f 的内存空间覆盖了。
共用体正确的使用方法如下:
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf( "data.i : %d
", data.i);
data.f = 220.5;
printf( "data.f : %f
", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s
", data.str);
return 0;
}
运行:
$ ./main
data.i : 10
data.f : 220.500000
data.str : C Programming