结构体入门:高效封装数据的利器
一、什么是结构体?
- 结构体是用户自定义的数据类型
- 可以把多个不同类型的变量打包在一起
- 用来描述一个完整的对象:学生、员工、点、书籍、游戏角色等
比如一个学生包含:学号(int)、姓名(string)、年龄(int)、成绩(double)用结构体就能整合成一个类型Student。
二、结构体定义语法
struct 结构体名 { 成员1类型 成员1名; 成员2类型 成员2名; 成员3类型 成员3名; }; // 注意末尾必须有分号示例:定义学生结构体
struct Student { int id; // 学号 string name; // 姓名 int age; // 年龄 double score; // 成绩 };三、结构体变量定义与初始化
1. 定义时初始化
Student stu = {1001, "张三", 18, 90.5};2. 先定义,后赋值
通过.成员访问符赋值
Student stu; stu.id = 1002; stu.name = "李四"; stu.age = 19; stu.score = 88.0;3. 访问成员
cout << stu.id << endl; cout << stu.name << endl; cout << stu.age << endl; cout << stu.score << endl;四、结构体数组
存储多个同类对象,比如一个班所有学生:
Student stuArr[3] = { {1001, "张三", 18, 90.5}, {1002, "李四", 19, 88.0}, {1003, "王五", 20, 95.0} };遍历:
for (int i = 0; i < 3; i++) { cout << stuArr[i].id << " " << stuArr[i].name << " " << stuArr[i].score << endl; }五、结构体与函数
1. 结构体作为函数参数(值传递)
void printStudent(Student s) { cout << s.name << " " << s.score << endl; }调用:
Student s = {1001, "张三", 18, 90.5}; printStudent(s);2. 结构体引用传参(推荐,不拷贝、效率高)
void setScore(Student &s, double newScore) { s.score = newScore; }这样可以直接修改原结构体,且效率更高。
3. 结构体指针(-> 用法)
指针访问成员用->,不用.
Student s = {1001, "张三", 18, 90.5}; Student *p = &s; cout << p->name << endl; cout << p->score << endl;六、完整综合实战案例
#include <iostream> #include <string> using namespace std; // 1. 定义结构体 struct Student { int id; string name; int age; double score; }; // 打印学生信息 void show(Student s) { cout << "学号:" << s.id << " 姓名:" << s.name << " 成绩:" << s.score << endl; } // 查找最高分学生 void findMax(Student arr[], int len) { int maxIndex = 0; for (int i = 1; i < len; i++) { if (arr[i].score > arr[maxIndex].score) { maxIndex = i; } } cout << "最高分是:"; show(arr[maxIndex]); } int main() { // 结构体数组 Student stuArr[3] = { {1001, "张三", 18, 90.5}, {1002, "李四", 19, 88.0}, {1003, "王五", 20, 95.0} }; // 遍历 for (int i = 0; i < 3; i++) { show(stuArr[i]); } // 找最高分 findMax(stuArr, 3); system("pause"); return 0; }七、结构体 vs 数组(对比理解)
- 数组:多个相同类型数据的集合
- 结构体:多个不同类型数据的集合
- 结构体数组:多个对象的集合
八、新手高频易错点
- 结构体定义末尾忘记写
; - 成员访问混淆
.和->- 普通变量用
. - 指针变量用
->
- 普通变量用
- 结构体直接比较
==(不允许,要逐个成员比较) - 结构体传参太大,不使用引用导致效率低
- 成员赋值顺序与定义顺序不一致
九、今日重点总结
- 结构体 = 自定义类型,可封装不同类型成员
- 访问成员:普通变量用
.,指针用-> - 结构体数组可表示一组对象
- 函数传参推荐用
const 引用高效安全 - 是面向对象编程的基础雏形
