一、结构体指针
定义学生结构体
struct Student
{
//成员列表
string name;
//年龄
int age;
//分数
int score;
};
1、创建结构体变量
Student s = { "张三",18,100 };
2、通过指针指向结构体变量
因为变量s
的类型是上面结构体新定义的Student
型,所以在定义指针p
的时候需要也将指针定义为Student
型的
Student * p = &s;
3、通过指针访问结构体变量中的数据
指针通过->
访问结构体中的变量
cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
二、结构体嵌套结构体
作用:结构体中的成员可以是另外一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录着一个学生的结构体
1、结构体定义
//1.结构体定义
//语法:struct 类型名称{成员列表}
struct Student
{
//成员列表
string name;
//年龄
int age;
//分数
int score;
};
struct Teacher
{
int id;
string name;
int age;
struct Srudent s;
};
2、结构体嵌套结构体
创建老师
//创建老师
Teacher t;
//老师的属性
t.id = 2021018;
t.name = "老王";
t.age = 50;
//老师对应的学生的属性
t.stu.age = 18;
t.stu.name = "张三";
t.stu.score = 100;
打印相关信息输出:
cout << "老师姓名:" << t.name
<< " 老师编号:" << t.id
<< " 老师年龄:" << t.age
<< " 学生姓名:" << t.stu.name
<< " 学生年龄:" << t.stu.age
<< " 学生分数:" << t.stu.score
<< endl;
out:
老师姓名:老王 老师编号:2021018 老师年龄:50 学生姓名:张三 学生年龄:18 学生分数:100
三、结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
——值传递
——地址传递在这里插入代码片
继续使用上一节定义的结构体
值传递:
void printStudent(Student stu)
{
cout << "学生姓名:" << stu.name << endl
<< "学生年龄:" << stu.age << endl
<< "学生分数:" << stu.score << endl;
}
因为上面只定义了结构体Teacher
的对象t
,所以若想传入Student
的参数,需要通过t
调用Teacher
结构体中的Student
结构体的对象stu
,即使用t.stu
来进行形参的传递。
printStudent(t.stu);
地址传递:
void printStudent_point(Student * stu)
{
cout << "学生姓名:" << stu->name << endl
<< "学生年龄:" << stu->age << endl
<< "学生分数:" << stu->score << endl;
}
将函数中的形参改为指针,进行地址传递,可以减少内存空间,而且不会复制新的副本出来。
printStudent_point(&t.stu);
在值传递时,形参发生改变不会影响实参,即函数内数据的修改不会影响函数外同一个数据的大小;
而地址传递时,形参修改可以改变实参,即函数内数据的修改会同时改变函数外同一个数据的大小。
总结:如果不想修改主函数中的数据,用值传递;反之如果想要修改主函数中的数据,用地址传递。
四、结构体中const的使用
作用:用const来防止误操作
void printStudent_point(const Student * stu)
{
stu->age = 100;
cout << "学生姓名:" << stu->name << endl
<< "学生年龄:" << stu->age << endl
<< "学生分数:" << stu->score << endl;
}
在代码中将传入的形参用const
修饰,再在打印函数中尝试改变形参的对象的属性值,输出会报错:
加入const
之后,一旦有修改的操作就会报错,可以防止我们误操作