共用体的关键概念
-
内存共享: 共用体的所有成员在同一内存位置上存储数据,因此在任意时刻,只有一个成员是有效的。其他成员会被覆盖。换句话说,共用体中的成员共享内存空间,每次只能存储一个成员的值。
-
内存大小: 共用体的大小是它所有成员中最大的成员所占用的空间大小。例如,您的
Data
共用体中,str
是一个20字节的数组,因此整个共用体的大小是20字节,而不是成员大小的总和。 -
用途: 共用体通常用于节省内存,特别是当您知道某个数据结构中不同成员不会同时使用时。它适合用来存储几种不同类型的数据,但每次只能用一个成员。
共用体的定义和访问
-
定义共用体: 您通过
union
关键字来定义共用体,它的格式如下:union Data { int i; float f; char str[20]; };
这里定义了一个名为
Data
的共用体,它包含一个int
类型的成员i
,一个float
类型的成员f
,以及一个字符数组str
,它可以存储一个字符串。 -
访问共用体成员: 使用
.
运算符来访问共用体成员。例如,data.i
表示访问Data
共用体的i
成员,data.f
表示访问f
成员,data.str
表示访问str
成员。
示例分析
示例 1:内存占用
#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: %d\n", sizeof(data));
return 0;
}
输出:
Memory size occupied by data: 20
在此例中,Data
共用体的大小是20字节,因为str
成员是一个20字节的字符数组,而i
和f
的大小分别是4字节(在大多数平台上),共用体的大小是最大的成员所占的空间,即20字节。
示例 2:存储多个值并覆盖
#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\n", data.i);
printf("data.f : %f\n", data.f);
printf("data.str : %s\n", data.str);
return 0;
}
输出:
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
在这个例子中:
data.i = 10
将整数10存储到i
成员。data.f = 220.5
将浮点数220.5存储到f
成员,覆盖了i
成员中的值。strcpy(data.str, "C Programming")
将字符串存储到str
成员,覆盖了f
成员的值。
因此,虽然您对多个成员进行了赋值,但实际上每个赋值操作都覆盖了前一个成员的数据。由于共用体的成员共享相同的内存空间,只有最后一个有效的成员(即str
)能够正确显示,而其他成员的值变得无效。
示例 3:只使用一个成员
#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\n", data.i);
data.f = 220.5;
printf("data.f : %f\n", data.f);
strcpy(data.str, "C Programming");
printf("data.str : %s\n", data.str);
return 0;
}
输出:
data.i : 10
data.f : 220.500000
data.str : C Programming
在这个例子中:
- 先将整数10存储到
data.i
,然后输出。 - 然后将浮点数220.5存储到
data.f
,覆盖了data.i
。 - 最后,将字符串
"C Programming"
存储到data.str
,覆盖了data.f
。
您可以看到,虽然依次给共用体的不同成员赋值,但是每次只有一个成员的值有效,其他成员的数据被覆盖。
总结
- 共用体允许在同一内存位置存储不同类型的数据,但在同一时刻只能存储一个成员的有效数据。
- 共用体的大小是它最大成员的大小,内存空间是共享的。
- 在使用共用体时,需要小心覆盖数据的问题,通常使用标志变量来确保只访问当前有效的成员。