c++结构体
结构体的基本概念:
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
结构体的定义和使用
- 语法:
struct 结构体名{
结构体成员列表;
};
- 通过结构体创建变量的三种方式:
struct 结构体名 变量名
struct 结构体名 变量名 = {成员1,成员2…};
定义结构体是顺便创建了变量
- 实例:
#include<iostream>
#include<string>
using namespace std;
//1.创建学生数据类型:姓名 年龄 分数
//自定义的数据类型,一些类型集合组成的一个类型
/*
语法:
struct 类型名称{
成员列表;
};
*/
struct Student {
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
};
/*
struct Student {
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
}s3; 顺便创建结构体变量
*/
//2.通过学生类型创建具体学生
/*
第一种
struct Student s1;
第二种
struct Student s2 = {.....}
第三种
在定义结构体的时候顺便创建结构体变量
*/
int main() {
//第一种
//结构体创建的时候struct关键字可以省略,结构体定义的时候不可以省略。
struct Student s1;
//给s1属性赋值,通过.访问结构体变量中的属性
s1.name = "张三";
s1.age = 12;
s1.score = 100;
cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;
//第二种
//struct Student s2 = { ..... };
struct Student s2 = { "李四",18,90 };
cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;
//第三种
//在定义结构体的时候顺便创建结构体变量
/*
s3.name = "王五";
s3.age = 89;
s3.score = 89;
cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;
*/
system("pause");
return 0;
}
姓名:张三 年龄:12 分数:100
姓名:李四 年龄:18 分数:90
请按任意键继续. . .
结构体数组
- 作用:将自定义的结构体放入数组中方便维护
- 语法:
struct 结构体名 数组名[元素个数] = {{},{},{},.....};
- 实例:
#include<iostream>
#include<string>
using namespace std;
//结构体数组
//1.创建一个结构体
struct Student {
//姓名
string name;
//年龄
int age;
//分数
int score;
};
int main() {
//2.创建一个结构体的数组
struct Student stuArray[3] = {
{"张三",78,89},
{"李四",45,99},
{"王五",45,88}
};
//3.给结构体中数组中的元素赋值
stuArray[2].name = "赵六";
stuArray[2].age = 11;
stuArray[2].score = 99;
//4.遍历结构体数组
for (int i = 0; i < 3; i++) {
cout << "姓名:" << stuArray[i].name << " 年龄:" << stuArray[i].age << " 分数:" << stuArray[i].score << endl;
}
system("pause");
return 0;
}
姓名:张三 年龄:78 分数:89
姓名:李四 年龄:45 分数:99
姓名:赵六 年龄:11 分数:99
请按任意键继续. . .
结构体指针
- 作用:通过指针访问结构体中的成员
- 注意:利用操作符->可以通过结构体指针访问结构体属性
- 实例:
#include<iostream>
#include<string>
using namespace std;
//结构体指针
//定义一个学生的结构体
struct student {
string name;//姓名
int age;//年龄
int score;//分数
};
int main() {
//1.创建学生的结构体变量
struct student s = {"zhangsan",78,100};
//2.通过指针直线结构体变量
struct student* p = &s;
//3.通过指针访问结构体变量中的数据
//利用操作符->可以通过结构体指针访问结构体属性
cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
system("pause");
return 0;
}
姓名:zhangsan 年龄:78 分数:100
请按任意键继续. . .
结构体嵌套结构体
-
作用:结构体的成员可以是另一个结构体
-
例如:每一个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
-
分析
-
实例:
#include<iostream>
#include<string>
using namespace std;
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 = 1000;
t.name = "老王";
t.age = 45;
t.stu.name = "小王";
t.stu.age = 23;
t.stu.score = 100;
cout << "老师姓名:" << t.name << " 老师编号:" << t.id << " 老师年龄:" << t.age << " 学生姓名:" << t.stu.name << " 学生的年龄: " << t.stu.age << " 学生的考试分数:" << t.stu.score << endl;
system("pause");
return 0;
}
老师姓名:老王 老师编号:1000 老师年龄:45 学生姓名:小王 学生的年龄: 23 学生的考试分数:100
请按任意键继续. . .
结构体做函数参数
- 作用:将结构体作为参数向函数中传递
- 传递方式
值传递
地址传递
- 实例:
#include<iostream>
#include<string>
using namespace std;
struct student {
//定义学生的结构体
string name;//学生姓名
int age;//学生年龄
int score;//学生分数
};
//1.值传递
void printStudent1(struct student s) {
s.age = 123;
cout << "printStudent1函数中:" << " 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;
}
//2.地址传递
void printStudent2(struct student * p) {
p->age = 200;
cout << "printStudent2函数中:" << " 姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
}
int main() {
//结构体作为函数的参数
//将学生传入一个参数中,打印学生上的所有信息
//创建结构体变量
struct student s;
s.name = "张三";
s.age = 12;
s.score = 90;
cout << "main()函数中打印结果:" << " 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;
printStudent1(s);
printStudent2(&s);
system("pause");
return 0;
}
main()函数中打印结果: 姓名:张三 年龄:12 分数:90
printStudent1函数中: 姓名:张三 年龄:123 分数:90
printStudent2函数中: 姓名:张三 年龄:200 分数:90
请按任意键继续. . .
结构体中const使用场景
- 作用:用const来防止误操作
- 实例:
#include<iostream>
#include<string>
using namespace std;
struct student {
//定义学生的结构体
string name;//学生姓名
int age;//学生年龄
int score;//学生分数
};
void printStudents(const student *s) {
//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
//值传递:会将实参中的数据拷贝出一份传递给形参,不会出现任何错误
//s->age = 123;加入const之后,一旦有修改的操作就会进行报错,可以防止误操作
cout << " 姓名:" << s->name << " 年龄:" << s->age << " 分数:" << s->score << endl;
}
int main() {
//const使用场景
//1.创建结构体变量
struct student s = { "张三",13,78 };
//2.通过函数打印结构体变量信息
printStudents(&s);
//cout << "main中张三的年龄为:" << s.age << endl;
system("pause");
return 0;
}
姓名:张三 年龄:13 分数:78
请按任意键继续. . .
结构体案例1
-
需求:学校正在做毕设项目,每名老师带领5个学生,总共有三名老师,设计学生和老师的结构体,其中在老师的结构体中,有老师的姓名和一个存放5名学生的数组作为成员,学生的成员有姓名、考试分数、创建数组存放3名老师,通过函数给每个老师以及所带的学生赋值,最终打印出老师数据以及老师所带的学生的数据
-
-
实例:
#include<iostream>
#include<string>
#include<ctime>
using namespace std;
//定义学生的结构体
struct Student {
//学生的姓名
string sName;
//学生的分数
int score;
};
//定义老师的结构体
struct Teacher {
//姓名
string tName;
//所带学生的数组
struct Student sArray[5];
};
void allocateSpace(struct Teacher tArray[],int len) {
string nameSeed = "ABCDE";
//给老师赋值
for (int i = 0; i < len;i++) {
tArray[i].tName = "Teacher_";
tArray[i].tName += nameSeed[i];
//通过循环给每名老师所带的学生进行赋值
for (int j = 0; j < 5; j++) {
tArray[i].sArray[j].sName = "Student_";
tArray[i].sArray[j].sName += nameSeed[j];
int random = rand() % 61 + 40;//40到100之间随机数
tArray[i].sArray[j].score = random;
}
}
}
void printInfo(struct Teacher tArray[],int len) {
for (int i = 0; i < len; i++) {
cout << "老师的姓名:" << tArray[i].tName << endl;
for (int j = 0; j < 5; j++) {
cout << "\t学生的姓名:" << tArray[i].sArray[j].sName << " 考试分数:" << tArray[i].sArray[j].score << endl;
}
}
}
int main() {
//添加随机数种子
srand((unsigned int)time(NULL));
//1.创建三名老师的数组
struct Teacher tArray[3];
//2.通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
int len = sizeof(tArray) / sizeof(tArray[0]);
allocateSpace(tArray, len);
//3.打印所有老师以及所带的学生的信息
printInfo(tArray, len);
system("pause");
return 0;
}
老师的姓名:Teacher_A
学生的姓名:Student_A 考试分数:54
学生的姓名:Student_B 考试分数:54
学生的姓名:Student_C 考试分数:59
学生的姓名:Student_D 考试分数:75
学生的姓名:Student_E 考试分数:80
老师的姓名:Teacher_B
学生的姓名:Student_A 考试分数:54
学生的姓名:Student_B 考试分数:93
学生的姓名:Student_C 考试分数:55
学生的姓名:Student_D 考试分数:55
学生的姓名:Student_E 考试分数:72
老师的姓名:Teacher_C
学生的姓名:Student_A 考试分数:94
学生的姓名:Student_B 考试分数:64
学生的姓名:Student_C 考试分数:95
学生的姓名:Student_D 考试分数:57
学生的姓名:Student_E 考试分数:78
请按任意键继续. . .
结构体案例2
- 需求:设计一个英雄的结构体包括:成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄,通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果
- 实例:
#include<iostream>
#include<string>
using namespace std;
//1.设计英雄结构体
//创建英雄的结构体
struct Hero {
//姓名
string name;
//年龄
int age;
//性别
string sex;
};
//冒泡排序,实现年龄升序排列
void bubbleSort(struct Hero heroArray[],int len) {
for (int i = 0; i < len - 1;i++) {
for (int j = 0; j < len - i - 1;j++) {
//如果j下标的元素年龄大于j+1下标的元素的年龄,交换两个元素
if (heroArray[j].age>heroArray[j+1].age) {
struct Hero temp = heroArray[j];
heroArray[j] = heroArray[j + 1];
heroArray[j + 1] = temp;
}
}
}
}
//打印排序后的数组的信息
void printHero(struct Hero heroArray[],int len) {
for (int i = 0; i < len; i++) {
cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl;
}
}
int main() {
//2.创建数组存放5名英雄
struct Hero heroArray[5] = {
{"刘备",23,"男"},
{"关羽",22,"女"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"}
};
int len = sizeof(heroArray) / sizeof(heroArray[0]);
/*
for (int i = 0; i < len; i++) {
cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl;
}
*/
//3.对数组进行排序,按照年龄进行升序排序
bubbleSort(heroArray, len);
//4.将排序后的结果进行打印输出
printHero(heroArray, len);
system("pause");
return 0;
}
姓名:貂蝉 年龄:19 性别:女
姓名:张飞 年龄:20 性别:男
姓名:赵云 年龄:21 性别:男
姓名:关羽 年龄:22 性别:女
姓名:刘备 年龄:23 性别:男
请按任意键继续. . .
下节:c++程序的内存模型