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 s1
struct 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=19
s.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);
}