C语言教程:结构体与联合体
5.1 结构体的定义与使用
1. 结构体的定义
在C语言中,结构体(struct
)是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起。结构体可以包含基本数据类型、数组、指针,甚至其他结构体。结构体的定义使用struct
关键字。
1.1 结构体的基本语法
struct StructName {
dataType member1;
dataType member2;
// ...
};
1.2 示例代码
#include <stdio.h>
// 定义一个结构体表示学生信息
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
// 创建一个结构体变量
struct Student student1;
// 为结构体成员赋值
snprintf(student1.name, sizeof(student1.name), "Alice");
student1.age = 20;
student1.gpa = 3.8;
// 输出结构体成员
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("GPA: %.2f\n", student1.gpa);
return 0;
}
2. 结构体的优点
- 数据封装:结构体允许将相关的数据组合在一起,便于管理和传递。
- 可读性:使用结构体可以提高代码的可读性,使数据的含义更加明确。
- 灵活性:结构体可以包含多种数据类型,适用于复杂数据的表示。
3. 结构体的缺点
- 内存占用:结构体的大小是其所有成员大小的总和,可能导致内存占用较大。
- 访问复杂性:访问结构体成员需要使用点运算符(
.
),在某些情况下可能会增加代码的复杂性。
4. 结构体的使用
4.1 结构体的初始化
结构体可以在定义时进行初始化。
struct Student student2 = {"Bob", 22, 3.5};
4.2 结构体数组
可以创建结构体的数组,以存储多个相同类型的结构体。
struct Student students[3] = {
{"Alice", 20, 3.8},
{"Bob", 22, 3.5},
{"Charlie", 21, 3.9}
};
4.3 结构体作为函数参数
结构体可以作为函数参数传递,支持按值传递和按引用传递(使用指针)。
void printStudent(struct Student s) {
printf("Name: %s, Age: %d, GPA: %.2f\n", s.name, s.age, s.gpa);
}
int main() {
struct Student student1 = {"Alice", 20, 3.8};
printStudent(student1);
return 0;
}
4.4 结构体指针
使用指针可以更高效地传递结构体,避免复制整个结构体。
void updateGPA(struct Student *s, float newGPA) {
s->gpa = newGPA; // 使用箭头运算符访问结构体成员
}
int main() {
struct Student student1 = {"Alice", 20, 3.8};
updateGPA(&student1, 3.9);
printf("Updated GPA: %.2f\n", student1.gpa);
return 0;
}
5. 注意事项
- 内存对齐:结构体的成员可能会因为内存对齐而导致内存浪费。可以使用
#pragma pack
指令来控制结构体的对齐方式。 - 嵌套结构体:结构体可以包含其他结构体,使用时需要注意成员的访问。
struct Address {
char street[100];
char city[50];
};
struct Student {
char name[50];
int age;
struct Address address; // 嵌套结构体
};
- 结构体的大小:使用
sizeof
运算符可以获取结构体的大小,注意结构体的大小可能会受到内存对齐的影响。
printf("Size of Student: %zu\n", sizeof(struct Student));
6. 总结
结构体是C语言中非常重要的特性,它提供了一种将不同类型的数据组合在一起的方式。通过合理使用结构体,可以提高代码的可读性和可维护性。在使用结构体时,需要注意内存管理和数据访问的方式,以确保程序的高效性和稳定性。