📌 结构体
所属等级:GESP 4级 | 难度: | 关键词:struct、成员、结构体数组、按字段排序
📝 考纲要求
- 理解结构体的概念,能把多个相关字段打包成一个整体;
- 掌握
struct的定义、声明与成员访问(.运算符); - 掌握结构体数组的定义与遍历;
- 能按某个字段对结构体数组进行排序(配合冒泡/选择排序)。
📖 通俗讲解
💡 一句话理解
结构体就像一个自定义档案袋,把属于同一事物的多个信息(如姓名、年龄、分数)装在一起,方便一起搬运和处理。
用 struct 名字 { 类型 成员1; 类型 成员2; }; 定义。声明变量后,用 变量.成员 访问,例如 stu.score。结构体数组 Student a[105]; 则每个元素都是一个档案袋,访问写成 a[i].score。
🖼️ 图解
struct Student { // 自定义档案袋
int id; // 学号
string name; // 姓名
};
一个 Student 变量的内存布局:
┌──────────┬──────────────┐
│ id │ name │ ← 两个字段打包
│ 1001 │ "Tom" │
└──────────┴──────────────┘
访问成员:stu.id = 1001; stu.name = "Tom"; (用点 .)C++
#include <iostream>
#include <string>
using namespace std;
struct Student { // 定义一个学生结构体
string name; // 姓名
int score; // 分数
};
int main() {
Student stu; // 声明一个学生变量
cin >> stu.name >> stu.score; // 通过 . 访问成员
cout << stu.name << " " << stu.score << endl;
return 0;
}
输入 / 输出Tom 95
Tom 95
🔵 核心必背重点
✅ 必背
- 访问成员用点
.:普通变量stu.score,数组元素a[i].score; - 结构体定义末尾必须有分号
};; - 结构体数组排序:比较时只看排序依据的字段,交换时整个结构体一起换;
- 结构体里可以放
string、数组等任意类型成员。
🔑
记忆口诀:“打包信息用 struct,末尾分号别漏掉;点号访问取成员,排序只看关键字段整体搬。”
🔴 考试拉分难点
⚠️ 难点
- 整体交换:排序交换两个学生时要交换整个结构体(含姓名、分数),不能只换分数;
- 按多字段排序:先比主字段,相等再比次要字段(用嵌套
if); - 结构体里放字符数组 vs string:用
string可直接赋值和比较,更简单。
🟡 高频易错陷阱
🚫 扣分坑点
- 定义结构体忘写结尾分号
};; - 用
stu->score(箭头)访问普通变量,应为点.(箭头用于指针); - 排序时只交换分数没交换姓名,数据对不上;
- 结构体数组下标越界,例如
a[n]。
🧪 例题演练
例题 1(基础题):结构体数组输入与输出
题目:输入 n(≤100)个学生的姓名和分数,输出第 1 个学生的信息。
C++
#include <iostream>
#include <string>
using namespace std;
struct Student {
string name;
int score;
};
int main() {
int n;
Student a[105]; // 结构体数组
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i].name >> a[i].score; // 逐个读入
}
cout << a[0].name << " " << a[0].score << endl;
return 0;
}
输入 / 输出3
Tom 95
Lucy 88
Bob 90
Tom 95
例题 2(模拟真题):按分数从高到低排序
题目:输入 n 个学生的姓名和分数,按分数降序输出(分数相同按输入顺序)。
C++
#include <iostream>
#include <string>
using namespace std;
struct Student {
string name;
int score;
};
int main() {
int n;
Student a[105], t; // t 为交换用的临时结构体
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i].name >> a[i].score;
for (int i = 0; i < n - 1; i++) { // 冒泡排序
for (int j = 0; j < n - 1 - i; j++) {
if (a[j].score < a[j + 1].score) { // 分数小的往后沉
t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; // 整体交换
}
}
}
for (int i = 0; i < n; i++)
cout << a[i].name << " " << a[i].score << endl;
return 0;
}
输入 / 输出3
Tom 95
Lucy 88
Bob 90
Tom 95
Bob 90
Lucy 88
🚫 错误示范
if (a[j].score < a[j+1].score) { int tmp=a[j].score; a[j].score=a[j+1].score; a[j+1].score=tmp; } —— 只换了分数没换姓名,姓名和分数错位。
🛡️ 避坑总结
- 结构体定义
struct X { ... };末尾分号不能省; - 访问成员用点
.,数组元素用a[i].成员; - 排序时比较看关键字段,交换要整条结构体一起换;
- 多字段排序先主后次,用嵌套判断;
- 优先用
string存姓名,避免字符数组越界。
💡 提示:按 ← → 方向键可在上一 / 下一知识点间快速翻页