第四章 结构体 目录
1 结构体
1.1 结构体的概念
结构体是用户自定义的数据类型,允许存储不同类型的数据
1.2 结构体的定义和使用
语法如下:
struct 结构体名 {
结构体成员列表
};//这里有分号
创建具体的变量有三种方法
struct 结构体名 变量名;
struct 结构体名 变量名={值1,值2,···};
struct 结构体名 {
结构体成员列表
}变量名;
创建一个学生数据类型,并创建具体的学生
#include<iostream>
#include<string>
using namespace std;
//定义一个结构体
// struct 类型名 { 成员列表 }
struct student {//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
}s3;//定义结构体时就创建
int main() {
//创建具体的学生
//struct 结构体名 变量名;
//直接定义
struct student s1;
//给其属性赋值 用.访问
s1.name = "张三";
s1.age = 17;
s1.score = 98;
cout << s1.name << "年龄" << s1.age << "成绩" << s1.score << endl;
//创建时就赋值
struct student s2 = { "李四",16,93 };
cout << s2.name << "年龄" << s2.age << "成绩" << s2.score << endl;
//给创结构体时创建的s3赋值
s3.name = "王五";
s3.age = 17;
s3.score = 88;
cout << s3.name << "年龄" << s3.age << "成绩" << s3.score << endl;
return 0;
}
创建结构体时可以省略struct
student s1;
//给其属性赋值 用.访问
s1.name = "张三";
s1.age = 17;
s1.score = 98;
1.3 结构体数组
创建语法如下
struct 结构体名 数组名 [ 元素个数 ] = { {},{},··· }
#include<iostream>
#include<string>
using namespace std;
//定义一个结构体
// struct 类型名 { 成员列表 }
struct student {//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
};
int main() {
//创建学生数组
student stu_arr[4] = {
{"张三",17,98},
{"李四",16,93},
{"王五",17,88},
{"赵六",16,84}
};
for (int i = 0; i < sizeof(stu_arr)/sizeof(stu_arr[0]); i++)
{
cout << stu_arr[i].name << "年龄" << stu_arr[i].age << "成绩" << stu_arr[i].score << endl;
}
return 0;
}
1.4 结构体指针
作用:通过指针访问结构体成员
- 利用操作符 -> 可以通过结构体指针访问结构体属性
#include<iostream>
#include<string>
using namespace std;
//定义一个结构体
// struct 类型名 { 成员列表 }
struct student {//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
};
int main() {
//创建学生
student s = { "张三",17,98 };
//通过指针指向结构体变量
student* p = &s;
//通过指针访问结构体变量中的数据
cout << p->name << "年龄" << p->age << "分数" << p->score << endl;
//解引用方法访问
cout << (*p).name << "年龄" << (*p).age << "分数" << (*p).score << endl;
return 0;
}
1.5 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
创建一个含有四个学生的班级
#include<iostream>
#include<string>
using namespace std;
struct student {
//姓名
string name;
//年龄
int age;
//分数
int score;
};
//定义一个班级结构体,包含四个学生
struct _class {
int id;//班级编好
int grade;//年级
int num;//学生数量
student s1;
student s2;
student s3;
student s4;
};
int main() {
//创建班级
_class class1;
//赋值
class1.id = 306;
class1.grade = 3;
class1.s1 = { "张三",17,98 };
class1.s2 = { "李四",16,93 };
class1.s3 = { "王五",17,88 };
//可以通过.访问子结构体的属性
class1.s4.name = "赵六";
class1.s4.age = 16;
class1.s4.score = 84;
return 0;
}
1.6 结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种
- 值传递
- 地址传递
#include<iostream>
#include<string>
using namespace std;
struct student {
//姓名
string name;
//年龄
int age;
//分数
int score;
};
//值传递
void print_stu(student s) {
cout << s.name << "的年龄是" << s.age << ",分数是" << s.score << endl;
}
//地址传递
void change_age(student* s, int age) {
s->age = age;
}
int main() {
//创建学生
student s1 = { "张三",17,98 };
//传入一个函数中打印信息
print_stu(s1);
//修改学生的年龄
int new_age;
cout << "请输入新的年龄:" << endl;
cin >> new_age;
//传入地址
change_age(&s1, new_age);
print_stu(s1);
return 0;
}
1.7 结构体中const的使用场景
作用:用const防止误操作
#include<iostream>
#include<string>
using namespace std;
struct student {
//姓名
string name;
//年龄
int age;
//分数
int score;
};
//将函数中的形参改为指针,可以减少内存消耗,提升效率
//但是会有原来的数据被修改的风险
//加入const防止误操作
void print_stu(const student* s) {
//s->age = 78;这个操作会报错
cout << s->name << "的年龄是" << s->age << ",分数是" << s->score << endl;
}
int main() {
//创建学生
student s1 = { "张三",17,98 };
//传入一个函数中打印信息
print_stu(&s1);
return 0;
}
例题
- 三个老师,每个人有五个学生
- 设计老师的结构体,有老师姓名和五个学生的学生数组
- 设计学生结构体,有姓名,分数
- 创建老师数组,打印所有信息
#include<iostream>
#include<string>
using namespace std;
struct student {
string name;
int score;
};
struct teacher {
string name;
student stu_arr[5];
};
void print_tchr_arr(teacher arr[], int length) {
for (int i = 0; i < length; i++)
{
cout << "老师的姓名是:" << arr[i].name << endl;
cout << "学生信息:" << endl;
for (int j = 0; j < 5; j++)
{
cout << "\t学生姓名:" << arr[i].stu_arr[j].name << "\t分数:" << arr[i].stu_arr[j].score << endl;
}
}
}
void allocate(teacher arr[], int length) {
//给老师名字赋值
string nameseed = "ABCDE";
for (int i = 0; i < length; i++)
{
//输入老师的名字
cout << "输入第" << i+1 << "个老师的名字:";
cin >> arr[i].name;
//给每个学生赋值
for (int j = 0; j < 5; j++)
{
cout << "输入第" << i+1 << "个老师的第" << j+1 << "个学生的名字:";
cin >> arr[i].stu_arr[j].name;
cout << "输入第" << i+1 << "个老师的第" << j+1 << "个学生的成绩:";
cin >> arr[i].stu_arr[j].score;
}
}
}
int main() {
teacher tchr_arr[3];
int length = sizeof(tchr_arr) / sizeof(tchr_arr[0]);
allocate(tchr_arr, length);
print_tchr_arr(tchr_arr, length);
return 0;
}