有什么建议的话写在讨论区
一、先搞懂:为什么需要结构体?
普通变量(如int a、string name)只能存储单一类型的数据,但现实中很多事物需要 “多个不同类型数据” 描述:
- 描述一个学生:需要学号(int)、姓名(string)、成绩(float)、生日(年 / 月 / 日,又是 3 个 int);
- 描述一本书:需要编号(int)、书名(string)、价格(double)、作者(string)。
如果用普通变量,存 1 个学生要定义int id; string name; float score;...,存 100 个学生就要定义 100 组,代码会极其混乱。
结构体(struct)的核心作用:把多个不同类型的变量 “打包” 成一个新的 “自定义类型”,像用 “模板” 一样批量创建统一格式的数据。
二、结构体的基础:定义与变量声明
1. 结构体的定义语法
c取消自动换行复制
struct 结构体名 {
数据类型1 成员变量1; // 成员可以是int、string、float等任意类型
数据类型2 成员变量2;
// ... 更多成员
}; // 注意:分号不能漏!
示例:定义 “学生” 结构体
cp取消自动换行复制
#include <string> // 用string类型需要包含此头文件
struct Student {
int id; // 学号(整数)
string name; // 姓名(字符串)
float score; // 成绩(浮点数)
int birthYear; // 出生年
}; // 分号必须加!
2. 声明结构体变量(3 种方式)
定义结构体后,需要声明 “变量” 才能使用,就像int a是声明 int 类型变量一样。
方式 1:定义结构体时直接声明
c取消自动换行复制
方式 2:定义后单独声明
cpp取消自动换行复制
方式 3:动态声明(用 new,存放在堆区)
cp取消自动换行复制
三、结构体的核心:访问成员变量
声明变量后,需要访问它的 “成员”(如 stu1 的 id、name),用点运算符(.) 或箭头运算符(->)。
1. 普通变量:用点运算符(.)
cp取消自动换行复制
输出结果:
plaintext取消自动换行复制
2. 指针变量:用箭头运算符(->)
如果是结构体指针,必须用->访问成员(或先解引用*p再用.,但->更简洁):
cpp取消自动换行复制
四、进阶 1:结构体变量的初始化
声明变量时可以直接初始化,有两种常用方式:
1. 按成员顺序初始化(需与结构体定义顺序一致)
cpp取消自动换行复制
2. 按成员名初始化(C++11 及以上支持,顺序可乱)
更灵活,推荐使用:
cpp取消自动换行复制
五、进阶 2:结构体数组(存多个同类数据)
如果需要存多个学生(如一个班级 30 人),用 “结构体数组” 最方便:
cpp取消自动换行复制
六、进阶 3:结构体作为函数参数
结构体变量可以像普通变量一样传给函数,有两种传递方式:
1. 值传递(拷贝一份数据,不影响原变量)
cpp取消自动换行复制
2. 引用传递(传地址,修改会影响原变量,更高效)
如果结构体成员多,值传递会拷贝大量数据,推荐用引用(&) 传递:
cpp取消自动换行复制
七、综合案例:简易学生信息管理
需求:录入 3 个学生信息,计算平均成绩,并输出成绩≥90 的学生。
cpp取消自动换行复制
八、常见错误与注意事项
- 忘记写分号:结构体定义结尾的;必须加,否则编译报错。
- 指针访问用错运算符:结构体指针必须用->,普通变量用.,不能混。
- 初始化顺序混乱:按顺序初始化时,必须与结构体成员定义顺序一致;按成员名初始化无此问题。
- 内存泄漏:用new声明的结构体指针,使用后必须delete,否则内存泄漏。
- 数据类型不匹配:给成员赋值时,类型要一致(如不能把字符串赋值给 int 类型的 id)。
九、小结
结构体的核心是 “自定义复合类型”,解决了 “多类型数据整合” 的问题,关键知识点:
- 定义:struct 结构体名 {成员列表};
- 变量:普通变量(. 访问)、指针变量(-> 访问)、数组(批量存储)
- 进阶:初始化(按顺序 / 按成员名)、函数参数(值传递 / 引用传递)
- 应用:常用于存储对象信息(学生、员工、图书等),是后续学习类(class)的基础。
799

被折叠的 条评论
为什么被折叠?



