在 C 语言中,struct
和 union
是两种重要的用户自定义数据类型,用于组织和管理复杂的数据。尽管它们有相似之处,但也有显著的区别。以下是对 struct
和 union
的详细介绍:
1. struct
(结构体)
struct
是一种用户定义的数据类型,它允许将不同类型的数据组合在一起,形成一个更复杂的数据结构。
特性
- 成员独立存储:每个成员都有独立的存储空间,彼此互不影响。
- 顺序存储:成员按照定义的顺序存储在内存中。
- 使用灵活:结构体可以包含不同类型的成员变量,适合描述复杂的对象或数据。
定义与使用
#include <stdio.h>
// 定义结构体
struct Person {
char name[50];
int age;
float height;
};
int main() {
// 初始化结构体
struct Person person1 = {"John", 25, 5.9};
// 访问成员
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Height: %.2f\n", person1.height);
return 0;
}
结构体的特点
- 每个成员都有各自的存储空间,结构体的大小是所有成员的大小之和(加上可能的内存对齐)。
- 可以使用点运算符
.
来访问结构体的成员。 - 可以嵌套使用结构体(结构体中包含另一个结构体)。
2. union
(共用体)
union
和 struct
类似,也是用于存储不同类型的数据。但与结构体不同的是,共用体中的所有成员共用一块内存,任何时候只能存储一个成员的值。
特性
- 共享存储空间:所有成员共用同一块内存,大小等于成员中最大者。
- 节省内存:由于共用体中所有成员共享内存,因此它的大小仅取决于最大成员的大小,适合需要节省空间的场合。
- 成员互斥:一次只能保存一个成员的值,存储新值时会覆盖上一个成员的值。
定义与使用
#include <stdio.h>
// 定义共用体
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
// 访问和修改成员
data.i = 10;
printf("Integer: %d\n", data.i);
data.f = 220.5;
printf("Float: %.1f\n", data.f);
// 设置字符串后,之前的成员值会被覆盖
strcpy(data.str, "C Programming");
printf("String: %s\n", data.str);
return 0;
}
共用体的特点
- 共用体的所有成员共享同一块内存,存储新成员时会覆盖之前的值。
- 可以使用点运算符
.
来访问共用体的成员。 - 共用体适合在不同时间段使用不同成员的场景,减少内存开销。
3. struct
和 union
的区别
特性 | 结构体 struct |
共用体 union |
---|---|---|
内存分配 | 每个成员都有独立的内存 | 所有成员共用一块内存 |
大小 | 结构体大小为所有成员大小之和 | 共用体大小等于最大成员的大小 |
成员访问 | 所有成员可以同时有效 | 每次只能存储一个成员,访问时其他成员被覆盖 |
用途 | 适合描述复杂的数据结构,所有成员可能同时有效 | 适合节省内存的场景,不同时间存储不同数据 |
4. 应用场景
struct
适合描述具有多个属性的对象或数据结构,所有属性可能同时有效。例如,描述一个人(姓名、年龄、身高)或描述一个二维坐标点(x 坐标和 y 坐标)。union
适合节省内存的场景,通常在不同时间段使用不同类型的值。例如,定义一个变量在不同的时间可能是整数、浮点数或字符串,但不会同时存储多个值。
总结
struct
允许同时存储多个不同类型的成员,适用于复杂的数据结构。union
通过共享内存节省空间,适用于需要节省内存的场景,但一次只能存储一个成员的值。