08章-结构体--C++基础入门学习笔记
8 结构体
8.1 结构体基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
结构题定义和使用
语法: struct 结构体名{ 结构体成员列表 };
通过结构体创建变量的方式有三种:
- struct 结构体名 变量名
- struct 结构体名 变量名=
- 定义结构体时顺便创建变量
示例:
#include<iostream> #include<string> using namespace std; //1、创建学生数据类型; //学生:姓名,年龄,分数 //自定义数据类型,一些类型集合组成的一个类型 //语法 struct 类型名称 { 成员列表 }; struct Student { //成员列表 //姓名 string name; //年龄 int age; //分数 int score; }s3; //2、通过学生类型创建具体学生 //2.1 struct Student s1; //2.2 struct Student s2 = {...} //2.3 在定义结构体时候顺便创建结构体变量 int main() { //2.1 struct Student s1; //struct 关键字可以省略 struct Student s1; s1.name = "张三"; s1.age = 18; s1.score = 100; cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl; //2.2 struct Student s2 = {...} struct Student s2 = { "李四",19,80 }; cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl; //2.3 在定义结构体时候顺便创建结构体变量 s3.name = "王五"; s3.age = 30; s3.score = 100; cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl; system("pause"); return 0; }
8.3 结构体数组
作用:将自定义的结构体放入到数组中方便维护;
语法:struct 结构体名 数组名[元素个数] = { {},{},..{} }
示例:
#include <iostream> #include <string> using namespace std; //结构体数组 //1、定义结构体 struct Student { //姓名 string name; //年龄 int age; //分数 int score; }; int main() { //2、创建结构体数组 struct Student stuArray[8] = { {"张三",18,100}, {"李四",29,99}, {"王五",18,50} }; //3、给结构体数组中的元素赋值 stuArray[0].name = "赵六"; stuArray[0].age = 80; stuArray[0].score = 60; //4、遍历结构体数组 for (int i = 0; i < 3; i++) { cout << "姓名" << stuArray[i].name << " 年龄:" << stuArray[i].age << " 分数:" << stuArray[i].score << endl; } system("pause"); return 0; }
8.4 结构体指针
作用:通过指针访问结构体中的成员
- 利用操作符
->
可以通过结构体指针访问结构体属性
示例:
#include<iostream> #include<string> using namespace std; //结构体指针 //定义学生结构体 struct Student { string name;//姓名 int age;//年龄 int score; //分数 }; int main() { //创建学生结构体变量 struct Student s = { "张三",18,100 }; //通过指针指向结构体变量 struct Student* p = &s; //通过指针访问结构体变量中数据 cout << "姓名: " << p->name << " 年龄: " << p->age << " 分数: " << p->score << endl; system("pause"); return 0; }
8.5 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
示例:
#include<iostream> #include<string> using namespace std; //定义学生结构体 struct Student { string name;//学生的姓名 int age; //学生的年龄 int score;//学生的分数 }; //定义老师结构体 struct Teacher { int id;//职工编号 string name; //教师姓名 int age; //年龄 struct Student stu;//辅导的学生 }; int main() { //结构体嵌套结构体 //创建老师 struct Teacher t; t.id = 2102; t.name = "王老师"; t.age = 66; t.stu.name = "王同学"; t.stu.age = 18; t.stu.score = 99; cout << "老师姓名: " << t.name << " 老师编号:" << t.id << " 老师年龄: " << t.age << " 老师辅导学生为" << t.stu.name <<" 学生年龄" << t.stu.age << " 学生分数" << t.stu.score << endl; system("pause"); return 0; }
8.6 结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
- 值传递
- 地址传递
示例:
#include<iostream> #include<string> using namespace std; //定义学生结构体 struct Student { //姓名 string name; //年龄 int age; //分数 int score; }; //打印学生信息函数 //1、值传递 void printStudent1(struct Student s) { s.age = 100; cout << "子函数1中 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl; } //2、地址传递 void printStudent2(struct Student* s) { s->age = 66; cout << "子函数2中 姓名:" << s->name << " 年龄:" << s->age << " 分数:" << s->score << endl; } int main() { //结构体做函数参数 //将学生传入到一个参数中,打印学生身上的所有信息 //创建结构体变量 struct Student s; s.name = "张三"; s.age = 18; s.score = 88; cout << "main 函数中打印 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl; printStudent2(&s); printStudent1(s); cout << "main 函数中打印 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl; system("pause"); return 0; }
8.7 结构体中const使用场景
作用:用const来防止误操作
示例:
#include<iostream> #include<string> using namespace std; //const使用场景 struct Student { //姓名 string name; //年龄 int age; //分数 int score; }; //值传递 void printStudent01(Student s) { s.age = 150; cout << "姓名: " << s.name << " 年龄: " << s.age << " 分数: " << s.score << endl; } //地址传递 //将函数中的形参改为指针,可以减少内存空间,而且不会赋值新的副本出来 //加入const之后,不能修改。只能读不能写。 void printStudent02(const struct Student* s) { cout << "姓名: " << s->name << " 年龄: " << s->age << " 分数: " << s->score << endl; } int main() { //创建结构体变量 struct Student s = { "张三", 15,98 }; //通过函数打印结构体变量信息 printStudent01(s); cout << "main 中 姓名: " << s.name << " 年龄: " << s.age << " 分数: " << s.score << endl; system("pause"); return 0; }
8.8 结构体案例
8.8.1 案例1
案例描述:学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下:
- 设计学生和老师和结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员
- 学生的成员有姓名,考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值
- 最重打印老师数据已经老师所带学生数据
示例:
#include<iostream> #include<string> #include<ctime> using namespace std; //学生的结构体 struct Student { //姓名 string sName; //分数 int score; }; //老师的结构体定义 struct Teacher { //姓名 string tName; //学生数组 struct Student sArray[5]; }; //给老师和学生赋值的函数 //给老师 void allocateSpace(struct Teacher tArray[], int len) { string nameSeed = "ABCDE"; //给老师开始赋值 for (int i = 0; i < len; i++) { tArray[i].tName = "Teacher_"; tArray[i].tName += nameSeed[i]; //通过循环给每名老师所带的学生赋值 for (int j = 0; j < 5; j++) { tArray[i].sArray[j].sName = "Student_"; tArray[i].sArray[j].sName += nameSeed[j]; int random_score = rand() % 61 + 40; tArray[i].sArray[j].score = random_score; } tArray[i].sArray; } } void printInfo(struct Teacher tArray[], int len) { for (int i = 0; i < len; i++) { cout << "老师姓名:" << tArray[i].tName << endl; for (int j = 0; j < 5; j++) { cout << "\t学生姓名:" << tArray[i].sArray[j].sName << " 考试分数:"<<tArray[i].sArray[j].score << endl; } } } int main() { //随机数种子 srand((unsigned int)time(NULL)); //1、创建3名老师的数组 struct Teacher tArray[3]; //2、通过函数给3名老师的信息赋值,并给老师带的学生信息赋值 int len = sizeof(tArray) / sizeof(tArray[0]); allocateSpace(tArray, len); //3、打印所有老师及所带学生的信息 printInfo(tArray, len); system("pause"); return 0; }
8.8.2 案例2
案例描述:
设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。
五名英雄的信息如下:
{"刘备", 23, "男"} {"关羽", 22, "男"} {"张飞", 20, "男"} {"赵云", 21, "男"} {"貂蝉", 19, "男"}
示例:
#include <iostream> #include <string> using namespace std; //1、设计英雄的结构体 struct Hero { //姓名 string name; //年龄 int age; //性别 string sex; }; //冒泡排序 void bubbleSort(struct Hero heroArray[], int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (heroArray[j].age > heroArray[j + 1].age) { struct Hero temp = heroArray[j]; heroArray[j] = heroArray[j + 1]; heroArray[j + 1] = temp; } } } } //打印排序后数组中的信息 void printHero(struct Hero heroArray[], int len) { for (int i = 0; i < len; i++) { cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl; } } int main() { //2、创建数组存放5名英雄 struct Hero heroArray[5] = { {"刘备", 23, "男"}, {"关羽", 22, "男"}, {"张飞", 20, "男"}, {"赵云", 21, "男"}, {"貂蝉", 19, "男"} }; int len = sizeof(heroArray) / sizeof(heroArray[0]); cout << "排序前的打印结果是" << endl; for (int i = 0; i < len; i++) { cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl; } //3、对数组进行排序,按照年龄进行升序排列 bubbleSort(heroArray, len); cout << "排序后的打印结果是" << endl; //4、讲排序后的结果打印输出 printHero(heroArray, len); system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!