在C语言中,结构体
(struct
)是一种用户定义的数据类型,它允许将不同类型的数据组合在一起。结构体非常适合用于表示复杂的数据结构,例如记录、对象等。通过结构体,可以将相关的数据字段封装在一起,方便管理和操作。
1. 定义结构体
结构体的定义使用struct
关键字,后面跟着结构体的名称和一组花括号{}
,花括号内部包含结构体的成员变量。每个成员变量可以是不同的数据类型。
struct Student {
char name[50]; // 学生姓名
int age; // 学生年龄
float gpa; // 学生GPA
};
在这个例子中,struct Student
定义了一个结构体,包含三个成员:name
(字符数组)、age
(整数)和gpa
(浮点数)。
2. 声明结构体变量
定义结构体后,你可以声明该结构体类型的变量。
struct Student student1; // 声明一个Student类型的变量
你也可以在定义结构体的同时声明变量:
struct Student {
char name[50];
int age;
float gpa;
} student1, student2; // 在定义结构体的同时声明两个变量
3. 访问结构体成员
使用.
操作符来访问结构体变量的成员。
strcpy(student1.name, "Alice"); // 设置学生姓名
student1.age = 20; // 设置学生年龄
student1.gpa = 3.8; // 设置学生GPA
4. 结构体的初始化
你可以在声明结构体变量时进行初始化:
struct Student student2 = {"Bob", 22, 3.5}; // 初始化结构体
在这种初始化方式中,成员变量按定义顺序依次赋值。
5. 结构体的嵌套
结构体可以嵌套定义,即一个结构体的成员可以是另一个结构体。
struct Date {
int year;
int month;
int day;
};
struct Person {
char name[50];
int age;
struct Date birthdate; // 嵌套结构体
};
使用嵌套结构体的示例:
struct Person person1;
person1.name = "Charlie";
person1.age = 30;
person1.birthdate.year = 1993;
person1.birthdate.month = 5;
person1.birthdate.day = 15;
6. 结构体的大小
结构体的大小是其所有成员大小的总和,但要注意内存对齐的问题。编译器可能会在结构体成员之间插入填充字节以优化内存访问效率。
#include <stdio.h>
int main() {
struct Student {
char name[50];
int age;
float gpa;
};
printf("Size of struct Student: %lu bytes\n", sizeof(struct Student));
return 0;
}
7. 结构体指针
你可以使用指向结构体的指针,并通过->
操作符访问成员。
struct Student *ptr;
ptr = &student1;
printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
printf("GPA: %.2f\n", ptr->gpa);
8. 结构体数组
你可以定义结构体数组来存储多个结构体实例。
struct Student students[3]; // 定义一个包含3个Student结构体的数组
strcpy(students[0].name, "Alice");
students[0].age = 20;
students[0].gpa = 3.8;
strcpy(students[1].name, "Bob");
students[1].age = 22;
students[1].gpa = 3.5;
strcpy(students[2].name, "Charlie");
students[2].age = 21;
students[2].gpa = 3.7;
9. 结构体与函数
结构体可以作为函数的参数和返回值。
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int age;
float gpa;
};
// 函数接受结构体作为参数
void printStudent(struct Student s) {
printf("Name: %s\n", s.name);
printf("Age: %d\n", s.age);
printf("GPA: %.2f\n", s.gpa);
}
// 函数返回结构体
struct Student createStudent(char name[], int age, float gpa) {
struct Student s;
strcpy(s.name, name);
s.age = age;
s.gpa = gpa;
return s;
}
int main() {
struct Student student1 = createStudent("Alice", 20, 3.8);
printStudent(student1);
return 0;
}
10. 结构体的位域
结构体支持位域操作,允许你定义一个成员占用特定的位数。
struct Flags {
unsigned int is_enabled : 1; // 占用1位
unsigned int mode : 2; // 占用2位
};
11. 结构体的联合(Union)
联合是一种特殊的数据结构,它允许你存储不同类型的数据,但一次只能存储其中一种。
union Data {
int i;
float f;
char str[20];
};
联合的大小等于其最大成员的大小。
总结
- 结构体允许你将不同类型的数据组合在一起,适合表示复杂的数据结构。
- 结构体的成员通过
.
操作符访问,指针通过->
操作符访问。 - 结构体可以嵌套、作为函数参数、返回值,以及用于数组等。
- 注意内存对齐问题,结构体的大小可能会大于其成员大小的总和。