一、结构体学习
结合示例分析学习:
1、创建学生数据类型:学生包括(姓名,年龄,分数)
自定义数据类型:一些类型集合组成的一个类型
语法: struct 类型名称 { 成员列表 }
struct Student
{
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
}s3;//顺便创建结构体变量
2、通过学生类型创建具体学生
PS:struct 关键字创建时(实例)可以省略,定义的时候不可省略
1)创建结构体学生
2.1 方法一:struct Student s1
struct Student s1;
s1.name = "Casper";
s1.age = 22;
s1.score = 150;
//调用输出string类型的记得引用头文件:#include <string>
cout << "姓名:" << s1.name << "\t" << "年龄:" << s1.age << "\t" << "分数:" << s1.score << endl;
2.2 方法二:struct Student s2 = { … }
struct Student s2 { "李四", 19, 80 };
cout << "姓名:" << s2.name << "\t" << "年龄:" << s2.age << "\t" << "分数:" << s2.score << endl;
2.3 方法三:在定义结构体时顺便创建结构体变量(不建议)
s3.name = "shabi";
s3.age = 35;
s3.score = 0;
cout << "姓名:" << s3.name << "\t" << "年龄:" << s3.age << "\t" << "分数:" << s3.score << endl;
3、结构体数组
作用:将自定义的结构放入到数组中方便维护
语法: struct 结构体名 数组名[元素个数] = { {},{}…{} }
结构体数组
3.1定义结构体
3.2创建结构体数组
struct Student stuArray[3] =
{
{"张三y",18,100},
{"陈沙b",20,80},
{"胡诌q",44,0}
};
3.3结构体数组中的元素赋值
stuArray[2].name = "胡zz";
3.4遍历结构体数组
for (int i = 0; i < 3; i++)
{
cout << "姓名:" << stuArray[i].name << "\t" << "年龄:" << stuArray[i].age << "\t" << "分数:" << stuArray[i].score << endl;
}
4、结构体指针
作用:通过指针访问结构体的成员
利用操作符->可以通过结构体指针访问结构体属性
1、创建学生结构体变量
Student stu1 = { "张三y",18,100 };
2、通过指针指向结构体变量
Student* p = &stu1;
3、通过指针访问结构体变量中的数据
cout << "姓名:" << p->name << "\t" << "年龄:" << p->age << "\t" << "分数:" << p->score << endl;
5、结构体嵌套结构体
struct MyStudent
{
string name;//姓名
int age;//年龄
int score;//分数
};
struct MyTeacher
{
int id;
string name;
int age;
struct MyStudent myStu;
};
void main()
{
//创建老师
MyTeacher t;
t.id = 10000;
t.name = "老王";
t.age = 50;
t.myStu.name = "小王";
t.myStu.age = 20;
t.myStu.score = 60;
}
6、结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式:传值、传引用
示例:
struct MyStudent s;
s.name = “张三”;
s.age = 20;
s.score = 85;
//年龄:20
printStudent1(s);
//年龄:100
printStudent1(&s);
7、结构体中const使用场景
作用:用const来防止误操作
//创建结构体变量
//struct Student s = { "张三",15,70 };
PS:
1、问题:通过函数打印结构体变量信息,虽然值传递不会改变数据信息,但是每次复制一份,造成了内存开销过大
解决方案:将函数中的形参改为指针,可以减少内存空间(指针存放的是地址,无论这块数据内容有多少,只占用4 or 8个字节,而且不会复制出一个新的副本出来)
printStudents(&s);
二、结构体练习题
1、设计一个英雄的结构体,包括姓名,年龄,性别;
创建结构体数组,数组中存放5名英雄;
通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排列,最终打印排序后的结果;
#include <iostream>
using namespace std;
//设计一个英雄的结构体
struct Hero
{
string name;
int age;
string sex;
};
//通过冒泡排序进行升序排序
void BubbleSort(struct Hero hero[], int len) {
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - 1; j++)
{
if (hero[i].age < hero[j].age)
{
Hero temp = hero[i];
hero[i] = hero[j];
hero[j] = temp;
}
}
}
}
int main()
{
//创建结构体数组
Hero hero[] =
{
{ "刘备",23,"男" },
{ "关羽",22,"男" },
{ "张飞",20,"男" },
{ "赵云",21,"男" },
{ "貂蝉",19,"女" }
};
//取得数组长度
int len = sizeof(hero) / sizeof(hero[0]);
BubbleSort(hero, len);
//打印排序后的结果
for (int i = 0; i < len; i++)
{
cout << hero[i].name << "\t" << hero[i].age << "\t" << hero[i].sex << "\t" << endl;
}
}