在C语言中,结构体(struct
)和联合体(union
)是用于组织和管理多种数据类型的复合数据类型。它们允许在一个变量中存储不同类型的数据。结构体和联合体的主要区别在于内存的分配方式。
struct
)结构体是一个复合数据类型,用于将不同类型的数据组合在一起。每个组成部分称为结构体的成员。结构体为每个成员分配独立的内存空间。
定义结构体时,需要使用关键字struct
,然后指定结构体的成员。
示例代码:定义和使用结构体
#include
#include
// 定义结构体
struct Student {
int id; // 学号
char name[50]; // 姓名
float gpa; // 平均绩点
};
int main() {
struct Student student1; // 声明结构体变量
student1.id = 1001; // 赋值
strcpy(student1.name, "Alice"); // 赋值(字符串用strcpy)
student1.gpa = 3.8;
printf("学号: %d\n", student1.id);
printf("姓名: %s\n", student1.name);
printf("GPA: %.2f\n", student1.gpa);
return 0;
}
说明:
struct Student
:定义一个名为Student
的结构体类型。student1
:使用定义的结构体类型创建一个变量。.
)访问,例如student1.id
、student1.name
。typedef
简化结构体定义使用typedef
关键字可以简化结构体类型的声明,使得结构体变量的定义更加简洁。
#include
#include
typedef struct {
int id;
char name[50];
float gpa;
} Student;
int main() {
Student student1; // 直接使用结构体名定义变量
student1.id = 1001;
strcpy(student1.name, "Alice");
student1.gpa = 3.8;
printf("学号: %d\n", student1.id);
printf("姓名: %s\n", student1.name);
printf("GPA: %.2f\n", student1.gpa);
return 0;
}
可以定义一个包含多个结构体元素的数组,适合存储多个相同类型的复合数据(例如一组学生信息)。
示例代码:结构体数组
#include
#include
typedef struct {
int id;
char name[50];
float gpa;
} Student;
int main() {
Student students[2]; // 定义结构体数组
students[0].id = 1001;
strcpy(students[0].name, "Alice");
students[0].gpa = 3.8;
students[1].id = 1002;
strcpy(students[1].name, "Bob");
students[1].gpa = 3.5;
for (int i = 0; i < 2; i++) {
printf("学生 %d:\n", i + 1);
printf(" 学号: %d\n", students[i].id);
printf(" 姓名: %s\n", students[i].name);
printf(" GPA: %.2f\n", students[i].gpa);
}
return 0;
}
可以使用结构体指针来高效地访问和修改结构体数据。通过结构体指针访问成员时,使用箭头运算符(->
)。
示例代码:结构体指针
#include
#include
typedef struct {
int id;
char name[50];
float gpa;
} Student;
int main() {
Student student = {1001, "Alice", 3.8};
Student *ptr = &student; // 定义指向结构体的指针
printf("学号: %d\n", ptr->id); // 使用箭头运算符访问成员
printf("姓名: %s\n", ptr->name);
printf("GPA: %.2f\n", ptr->gpa);
return 0;
}
union
)联合体与结构体相似,但其所有成员共享同一块内存,因此一个联合体变量的大小等于其最大成员的大小。联合体的一个典型用途是实现类型转换或存储多个可能的值。
示例代码:定义和使用联合体
#include
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("整数: %d\n", data.i);
data.f = 220.5;
printf("浮点数: %.2f\n", data.f);
strcpy(data.str, "Hello");
printf("字符串: %s\n", data.str);
return 0;
}
说明:
data.f = 220.5
后,data.i
的值会受到影响。特性 | 结构体 (struct ) |
联合体 (union ) |
---|---|---|
内存分配 | 每个成员独立分配内存 | 所有成员共享同一块内存 |
使用场景 | 适合存储多种不同类型的数据 | 适合存储多种可能的数据类型 |
数据安全 | 各成员间相互独立,不会互相影响 | 成员间相互影响,赋值一个影响所有 |
结构体和联合体可以嵌套使用,来创建更复杂的数据结构。
示例代码:结构体嵌套联合体
#include
#include
typedef struct {
int id;
char name[50];
union {
float gpa;
char grade[2];
} performance;
} Student;
int main() {
Student student1;
student1.id = 1001;
strcpy(student1.name, "Alice");
student1.performance.gpa = 3.8; // 使用GPA
Student student2;
student2.id = 1002;
strcpy(student2.name, "Bob");
strcpy(student2.performance.grade, "A"); // 使用等级
printf("学生1: %s, GPA: %.2f\n", student1.name, student1.performance.gpa);
printf("学生2: %s, 等级: %s\n", student2.name, student2.performance.grade);
return 0;
}
说明:
performance
允许在Student
结构体中储存多种类型的成绩信息。performance.gpa
或performance.grade
。结构体和联合体是C语言中强大的复合数据类型,用于管理复杂的数据结构。结构体适用于存储多个独立数据,而联合体则适合用于节省内存并在同一位置存储不同类型的数据。