- 8.1 结构体基本概念
- 结构是是用户自定义的数据类型,运行用户存储不同的数据类型
- 8.2 结构体定义和使用
- 语法:struct 结构体名{ 结构体成员列表 };
- 通过结构体创建变量的方式有三种:
- 1. struct 结构体名 变量名
- 2. struct 结构体名 变量名 = { 成员1值,成员2值... }
- 3. 结构体创建的时候顺便创建变量
- 示例:
-
// 1. 创建结构体Student,自定义数据类型 struct Student { // 成员列表 string name; int age; int score; }s3; //2.3. 结构体创建的时候顺便创建变量 int main() { // 2. 通过结构体创建变量的方式有三种: //2.1. struct 结构体名 变量名 struct Student s1; // 使用结构体的时候,struct关键字可以省略 s1.name = "张三"; s1.age = 18; s1.score = 100; cout << " 姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl; //2.2. struct 结构体名 变量名 = { 成员1值,成员2值... } struct Student s2 = {"李四", 19, 98}; cout << " 姓名: " << s2.name << " 年龄: " << s2.age << " 分数: " << s2.score << endl; //2.3. 结构体创建的时候顺便创建变量 s3.name = "王五"; s3.age = 20; s3.score = 66; cout << " 姓名: " << s3.name << " 年龄: " << s3.age << " 分数: " << s3.score << endl; }
-
- 8.3 结构体数组
- 作用:将自定义的结构体放入到数组中方便维护
- 语法: struct 结构体名 数组名[ 元素个数 ] = { {}, {}, ... {} }
- 示例
-
// 1. 创建结构体Student,自定义数据类型 struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { struct Student arr[3] = { {"张三", 18, 60}, {"李四", 19, 98}, {"王五", 40, 60} }; for (int i = 0; i < 3; i++) { cout << " 姓名: " << arr[i].name << " 年龄: " << arr[i].age << " 分数: " << arr[i].score << endl; } }
-
- 8.4 结构体指针
- 作用:通过指针访问结构体中的成员
- 利用操作符 -> 可以通过结构体指针访问结构体属性
- 步骤
- 1. 创建结构体变量
- 2. 通过指针指向结构体变量
- 3. 通过指针访问结构体变量中的数据
- 示例
-
// 1. 创建结构体Student,自定义数据类型 struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { //1. 创建结构体变量 struct Student s = {"zhangsan", 18, 78}; //2. 通过指针指向结构体变量 struct Student* p = &s; //3. 通过指针访问结构体变量中的数据 cout << " 姓名: " << p->name << " 年龄: " << p->age << " 分数: " << p->score << endl; cout << " 结构体指针的大小: " << sizeof(p) << endl; // 4 }
-
- 8.5 结构体嵌套结构体
- 作用: 结构体中的成员可以使另一个结构体
- 例如:每一个老师辅导一个学生,一个老师的结构体中记录一个学生的结构体
- 示例
-
// Student结构体 struct student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; // teacher 结构体 struct teacher { // 成员列表 int id; // 教师编号 string name; // 教师姓名 int age; // 教师年龄 struct student stu; // 子结构体 学生 }; int main() { teacher t; t.id = 10000; t.name = "王老师"; t.age = 40; t.stu.name = "张三"; t.stu.age = 10; t.stu.score = 98; cout << " 老师ID: " << t.id << " 老师名字: " << t.name << " 老师年龄: " << t.age << endl; cout << " 学生姓名: " << t.stu.name << " 学生年龄: " << t.stu.age << " 学生分数: " << t.stu.score << endl; }
-
- 8.6 结构体做函数参数
- 作用:将结构体作为参数向函数中传递
- 传递方式有两种:
- 1. 值传递
- 2. 地址传递
- 示例
-
// Student结构体 struct student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; void printStudent1(struct student s) { // 值传递 cout << "子函数1 姓名: " << s.name << " 学生年龄: " << s.age << " 学生分数: " << s.score << endl; } void printStudent2(struct student *s) { // 引用传递 cout << "子函数2 姓名: " << s->name << " 学生年龄: " << s->age << " 学生分数: " << s->score << endl; } int main() { student s = { "zhangsan", 18, 80 }; printStudent1(s); printStudent2(&s); }
-
- 8.7 结构体中 const 使用场景
- 作用:const防止误操作
- 示例
-
// Student结构体 struct student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; // 将函数的形参改为指针,可以减少内存空间,而且不会复制一个副本 // 指针只占四字节 void printStudent(const student *s) { //s->score = 100; // 加入const之后,不可以修改 cout << "子函数2 姓名: " << s->name << " 学生年龄: " << s->age << " 学生分数: " << s->score << endl; } int main() { student s = { "zhangsan", 18, 80 }; printStudent(&s); }
-
- 8.8 结构体案例