概念
- 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
定义和使用
语法:
struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种:
- struct 结构体名变量名
- struct结构体名变量名={成员1值,成员2值…}
- 定义结构体时顺便创建变量
//自定义数据类型,一些类型集合组成的一个类型
//语法 struct类型名称 { 成员列表 }
方法1:
struct Student
{
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
}s3; //顺便创建结构体变量,s3就是结构体变量
int main()
{
//2.1 struct Student s1
//struct关键字可以省略
struct Student s1;
//给 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 = 20;
s3.score = 60;
cout << "姓名: " << s3.name << " 年龄: " << s3.age << " 分数:" << s3.score << endl;
return 0;
}
结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:
语法:struct 结构体名 数组名[元素个数] = { {} ,{},... {} }
//结构体数组
//1. 定义结构体
struct Student
{
string name;
int age;
int score;
};
int main()
{
//2. 创建结构体数组
struct Student stuArr[3] =
{
{"张三", 18 ,100},
{"李四", 28 , 90},
{"王五",38 , 80}
};
//3. 给结构体数组中的元素赋值,数组里面的内容可以改
stuArr[2].name = "赵六";
stuArr[2].age = 58;
stuArr[2].score = 60;
//4. 遍历结构体数组
for (int i = 0; i < 3; i++)
{
cout << "姓名; " << stuArr[i].name;
cout << " 年龄:" << stuArr[i].age;
cout << " 分数:" << stuArr[i].score << endl;
}
return 0;
}
结构体指针
作用:通过指针访问结构体中的成员
//结构体指针
//定义结构体
struct Student
{
string name;
int age;
int score;
};
int main3()
{
//1. 创建学生结构体变量
struct Student s = { "张三", 18 , 100 };
//2. 通过指针指向结构体变量
struct Student* p = &s;
//3. 通过指针访问结构体变量中的数据
cout << "姓名: " << p->name
<< " 年龄: " << p->age
<< " 分数: " << p->score << endl;
return 0;
结构体嵌套结构体
结构体中的成员可以是另一个结构体
例如:每个老师辅导一 个学员,一个老师的结构体中,记录一个学生的结构体
//定义学生结构体
struct student
{
string name;
int age;
int score;
};
//定义老师结构体
struct teacher
{
string name; // 教师姓名
int age; //教师年龄
int id; //教师编号
struct student stu; //辅导的学生
};
struct teacher tArr[1] =
{
{"王老师", 50 ,10000}
};
struct student sArr[1] =
{
{"张三", 20, 80}
};
int main()
{
//结构体嵌套结构体
//创建老师
teacher t;
t.id = 10000;
t.name = "王老师";
t.age = 50;
t.stu.name = "张三";
t.stu.age = 20;
t.stu.score = 80;
cout << "教师姓名: " << t.name << " 教师编号: " << t.id << " 教师年龄: " << t.age
<< " 教师辅导的学生姓名: " << t.stu.name << " 学生年龄:"
<< t.stu.age << " 学生分数: " << t.stu.score << endl;
//用数组来写
cout << "教师姓名: " << tArr[0].name << " 教师编号: " << tArr[0].id << " 教师年龄: "
<< tArr[0].age << " 教师辅导的学生姓名: " << sArr[0].name << " 学生年龄:"
<< sArr[0].age<< " 学生分数: " << sArr[0].score << endl;
return 0;
}
结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
- 值传递
- 地址传递
//定义结构体
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 *p)
{
p->age = 100;
cout << "子函数2中打印 姓名: " <<p->name << " 年龄: " << p->age
<< " 分数:" << p->score << endl;
}
int main()
{
//结构体做函数参数
//将学生传入到一个参数中, 打印学生身上的所有信息
//创建结构体变量
struct Student s = { "张三", 18 , 100 };
PrintStudent1(s);//值传递
cout << "main函数中打印 姓名: " << s.name << " 年龄: " << s.age << " 分数:"
<< s.score << endl;
PrintStudent2(&s);//地址传递
cout << "main函数中打印 姓名: " << s.name << " 年龄: " << s.age << " 分数:"
<< s.score << endl;
return 0;
}
注意:
结构体做函数参数
值传递时,形参发生改变,不会影响实参的值,
地址传递时,形参发生改变,实参也会相应改变。
结构体中 const使用场景
用 const 来防止误操作
struct student
{
string name;
int age;
int score;
};
//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
void PrintStudent(const student *s)
{
加入const后,一旦有修改的操作就会报错,可以防止我们的误操作
//s->age = 150;
cout << "姓名: " << s->name << " 年龄: " << s->age << " 分数:" << s->score << endl;
}
int main()
{
//创建结构体变量
struct student s = { "张三", 15 ,70 };
//通过函数打印结构体变量信息
PrintStudent(&s);
cout << "张三的年龄为: " << s.age << endl;
return 0;
}