结构体
约 1157 字大约 4 分钟
2025-06-13
结构体( struct
)是C语言中一种非常重要的复合数据类型,它允许我们把多个不同类型的数据组合成一个整体。在实际开发中,结构体广泛用于表示现实世界中的对象或复杂的数据结构。
C语言结构体详解:定义、赋值、取值与使用
本文将从以下几个方面详细介绍C语言中结构体的使用:
- 结构体的定义方式
- 结构体变量的声明与初始化
- 结构体成员的赋值与访问
- 结构体的嵌套使用
- 结构体作为函数参数和返回值
- 实际案例演示
一、结构体的定义方式
1. 基本语法
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
...
};
例如,定义一个描述“学生”的结构体:
struct Student {
char name[20]; // 学生姓名
int age; // 年龄
float score; // 分数
};
2. 使用 typedef 简化结构体类型名称
可以结合 typedef
为结构体起一个别名,简化后续使用:
typedef struct {
char name[20];
int age;
float score;
} Student;
这样可以直接用 Student
来声明变量:
Student s1, s2;
二、结构体变量的声明与初始化
1. 声明结构体变量
struct Student s1; // 方式一:使用原始结构体名
Student s2; // 方式二:使用 typedef 别名
2. 初始化结构体变量
可以在声明时直接初始化:
Student s = {"张三", 20, 95.5};
也可以逐个赋值:
strcpy(s.name, "李四");
s.age = 22;
s.score = 88.0;
三、结构体成员的赋值与访问
1. 使用点操作符 .
访问成员
s.age = 20;
printf("年龄:%d\n", s.age);
2. 使用指针访问成员
先定义指向结构体的指针:
Student *p = &s;
然后使用 ->
操作符访问成员:
p->age = 25;
printf("年龄:%d\n", p->age);
四、结构体的嵌套使用
结构体中可以包含另一个结构体作为成员。例如:
typedef struct {
int year;
int month;
int day;
} Date;
typedef struct {
char name[20];
Date birthday; // 包含另一个结构体
} Person;
访问嵌套成员:
Person p;
strcpy(p.name, "王五");
p.birthday.year = 2000;
p.birthday.month = 5;
p.birthday.day = 20;
printf("出生日期:%d-%d-%d\n", p.birthday.year, p.birthday.month, p.birthday.day);
五、结构体作为函数参数和返回值
1. 将结构体作为函数参数
void printStudent(Student s) {
printf("姓名:%s\n", s.name);
printf("年龄:%d\n", s.age);
printf("分数:%f\n", s.score);
}
调用方式:
printStudent(s);
⚠️ 注意:传递结构体会进行拷贝,如果结构体较大,建议使用指针传参以提高效率。
2. 使用指针传参更高效
void printStudentPtr(const Student *s) {
printf("姓名:%s\n", s->name);
printf("年龄:%d\n", s->age);
printf("分数:%f\n", s->score);
}
printStudentPtr(&s);
3. 返回结构体
函数也可以返回结构体:
Student createStudent(char *name, int age, float score) {
Student s;
strcpy(s.name, name);
s.age = age;
s.score = score;
return s;
}
使用方式:
Student s = createStudent("赵六", 21, 90.0);
六、结构体数组
我们可以定义一个结构体数组来管理多个相同类型的对象:
Student students[3] = {
{"小明", 18, 92},
{"小红", 19, 96},
{"小刚", 20, 94}
};
for (int i = 0; i < 3; i++) {
printf("第 %d 位同学:\n", i + 1);
printf("姓名:%s\n", students[i].name);
printf("年龄:%d\n", students[i].age);
printf("分数:%f\n", students[i].score);
}
七、完整示例代码
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN 20
// 定义结构体
typedef struct {
char name[MAX_NAME_LEN];
int age;
float score;
} Student;
// 函数声明
void printStudent(Student s);
void printStudentPtr(const Student *s);
Student createStudent(char *name, int age, float score);
int main() {
// 声明并初始化结构体
Student s1 = {"张三", 20, 95.5};
Student s2;
strcpy(s2.name, "李四");
s2.age = 22;
s2.score = 88.0;
// 使用函数打印
printStudent(s1);
printStudentPtr(&s2);
// 创建新学生
Student s3 = createStudent("王五", 21, 90.0);
printStudent(s3);
return 0;
}
// 打印学生信息(传值)
void printStudent(Student s) {
printf("【传值打印】\n");
printf("姓名:%s\n", s.name);
printf("年龄:%d\n", s.age);
printf("分数:%f\n\n", s.score);
}
// 打印学生信息(传指针)
void printStudentPtr(const Student *s) {
printf("【传指针打印】\n");
printf("姓名:%s\n", s->name);
printf("年龄:%d\n", s->age);
printf("分数:%f\n\n", s->score);
}
// 创建学生
Student createStudent(char *name, int age, float score) {
Student s;
strcpy(s.name, name);
s.age = age;
s.score = score;
return s;
}
八、总结
操作 | 方法 |
---|---|
定义结构体 | struct { ... }; 或 typedef struct { ... } Type; |
声明变量 | Type var; |
初始化 | 在声明时直接赋值或逐个赋值 |
赋值/访问 | 使用 . 操作符;指针则用 -> |
嵌套结构体 | 可以包含其他结构体作为成员 |
作为函数参数 | 可传值也可传指针(推荐传指针) |
作为返回值 | 支持返回整个结构体 |