8.1结构体基本概念
8.2结构体定义和使用
定义语法:struct 结构体名 {结构体成员列表};
通过结构体创建变量的方式有3种:
- struct 结构体名 变量名
- struct 结构体名 变量名 = { 成员1值 ,成员2值…}
- 定义结构体时顺便创建变量
EXAMPLE:
//1.创建学生数据类型 : 学生包括(姓名,年龄,分数)//自定义数据类型,一些类型集合组成的一个类型//语法 struct 类型名称 { 成员列表 }struct student{//成员列表//姓名string name;//年龄int age;//分数int score;}#include<string>//2.通过学生类型创建具体学生int main(){//2.1 struct student s1struct student s1;//struct关键字可以不写//给s1属性赋值,通过,访问结构体变量中的属性s1.name = "张三";s1.age = 18;s1.score =100;cout<<"姓名: "<<s1.name<<"年龄: "<<s1.age<<"分数:"<<s1.score<<endl;//s1.name是string类型,输出string类型需要多一个头文件#include<string>//2.2 struct student s2 = {...}struct student s2 = {"李四" , 19 , 80};cout<<"姓名: "<<s2.name<<"年龄: "<<s2.age<<"分数:"<<s2.score<<endl;//2.3在定义结构体时顺便创建结构体变量(一般不建议使用)//在定义结构体的时候,在括号}外边创建变量,比如:s3//然后再给s3赋值s3.name = "王五";s3.age = 20;s3.score =70;cout<<"姓名: "<<s3.name<<"年龄: "<<s3.age<<"分数:"<<s3.score<<endl;}
注意:结构体变量创建的时候struct可以省略
结构体定义的时候struct不可以省略
结构体变量利用操作符” . “访问成员
8.3结构体数组
作用:将自定义的结构体放入数组中方便维护
语法:struct 结构体名 数组名{元素个数} ={ { } , { } ,…{ } }
EXAMPLE
//定义结构体struct student{//成员列表string name; //姓名int age; //年龄int score; //分数}#include<string>int main(){//创建结构体数组struct student arr[3] ={{"张三",18,90},{"李四",19,78},{"王五",23,90}};//给结构体数组中的元素赋值arr[2].name="赵六";//遍历结构体数组for (int i = 0; i<3 ; i++){cout<<"姓名: "<<arr[i].name<<"年龄: "<<arr[i].age<<"分数:"<<arr[i].score<<endl;}
结构体数组:
- 定义结构体
- 创建结构体数组
- 给结构体数组中的元素赋值
- 遍历结构体数组
8.4结构体指针
作用:通过指针访问结构体中的成员
利用操作符->可以通过结构体指针访问结构体属性
EXAMPLE
//定义结构体struct student{//成员列表string name; //姓名int age; //年龄int score; //分数}#include<string>int main(){//创建学生结构体变量student stu = {"张三",18,90};//通过指针指向结构体变量student * p = &stu;//通过指针访问结构体变量中的数据cout<<"姓名: "<<p->name<<"年龄: "<<p->age<<"分数:"<<p->score<<endl;
8.5结构体嵌套结构体
作用:结构体的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
EXAMPLE
//定义学生结构体struct student{//成员列表string name; //姓名int age; //年龄int score; //分数}//定义教师结构体struct teacher{//成员列表int id;//职工编号string name;//老师姓名int age;//老师姓名struct student stu;//辅导的学生}int main(){//结构体嵌套结构体//创建老师teacher t;t.id = 10000;t.name = "老王";t.age = 50;t.stu.name = "小王";t.stu.age = 20;t.stu.score = 60;cout<<"老师姓名: "<<t.name<<"老师编号: "<<t.id<<"老师年龄: "<<t.age<<"老师辅导的学生姓名: "<<t.stu.name<<"学生年龄: "<<t.stu.age<<"学生考试分数: "<<t.stu.score <<endl;}
8.6结构体做函数参数
- 值传递(形参不会改变实参)
- 地址传递 (形参可以改变实参) ```cpp //定义学生结构体 struct student { //成员列表 string name; //姓名 int age; //年龄 int score; //分数 }
//打印学生信息的函数 //值传递 void print01(struct student s) { cout<<”姓名: “<<s.name <<”年龄: “<<s.age <<”分数:”<<s.score<<endl; }
//地址传递
//形参用指针,可以减少内存空间,不会复制新的副本出来
void print02(struct student * p)
{
cout<<”姓名: “<
//创建结构体变量struct student s;s.name="张三";s.age=19s.score=85;print01(s);print02(&s);
}
<a name="minU0"></a># 8.7结构体中const使用场景作用:用const来防止误操作<br />EXAMPLE:```cpp#include <string>//定义学生结构体struct student{//成员列表string name; //姓名int age; //年龄int score; //分数}//有了const之后,一旦有修改的操作,就会报错,可以防止误操作void print(const student *s){cout<<"姓名: "<<s->name<<"年龄: "<<s->age<<"分数:"<<s->score<<endl;}//const的使用场景int main(){//创建结构体变量struct student s ={"张三",15 ,78};//通过函数打印结构体变量信息print(&s);}
案例1

