结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
语法:struct 结构体名 {结构体成员列表}
通过结构体创建变量有三种方式:
#include
using namespace std;
#include
//创建学生数据类型: 学生包括(姓名,年龄,分数)
struct Student {
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int scores;
}s3;//创建结构体变量
//通过学生类型创建具体学生
int main() {
//在这里struct关键字可省略
//1 struct Student s1;
struct Student s1;
s1.name = "张三";
s1.age = 18;
s1.scores = 100;
cout << "姓名:" << s1.name << endl;
cout << "年龄:" << s1.age << endl;
cout << "分数:" << s1.scores << endl;
//2 struct Student s2 = {..};
struct Student s2 = { "李四",19,30 };
cout << "姓名:" << s2.name << endl;
cout << "年龄:" << s2.age << endl;
cout << "分数:" << s2.scores << endl;
//3 在定义结构体时顺便创建结构体变量
s3.name = "万个牛";
s3.age = 9;
system("pause");
return 0;
}
一 结构体数组
将自定义的结构体放到数组中方便维护
struct Student arr[3] = {
{"假假按揭啊",2,10},
{"kikiki",30,980},
{"lala",5,23}
};
arr[0].name = "titi";//给第一个人改名字
arr[1].age = 333;//给第二个人改年龄
//遍历
for (int i = 0; i < 3; i++) {
cout << "姓名:" << arr[i].name << " 年龄: " << arr[i].age << " 分数: " << arr[i].scores << endl;
}
二 结构体指针
通过指针访问结构体成员
//通过指针指向结构体变量
struct Student* p = &s1;
//通过指针访问结构体变量中的数据
cout << "姓名:" << p->name << " 年龄: " << (*p).age << " 分数: " << p->scores << endl;
//p->name 相当于(*p).name 解引用运算符优先级低于点运算符优先级,所以要加括号
三 结构体嵌套结构体
结构体中的成员可以是另一个结构体
#include
using namespace std;
#include
//学生
struct student {
string name;
int age;
int score;
};
//老师
struct teacher {
int id;
string name;
int age;
struct student stu;//辅导的学生
};
int main() {
teacher t;
t.name = "颖子";
t.id = 1;
t.age = 18;
t.stu.name = "蛋黄";
t.stu.age = 18;
t.stu.score = 100;
cout << "老师姓名: " << t.name << " id: " << t.id << " 老师年龄: " << t.age << " 老师辅导的学生: " << t.stu.name << " 年龄: " <<t.stu.age<< " 分数: " << t.stu.score << endl;
system("pause");
return 0;
}
四 结构体作为函数参数
#include
using namespace std;
#include
//学生
struct student {
int age;
string name;
int score;
};
//值传递
void printStudent1(struct student s){
cout << s.name << s.age << s.score << endl;
}
//地址传递
void printStudent2(struct student *p) {
p->name = "巨头";
cout << p->name << (*p).age << p->score << endl;
//“—>”成员访问运算符
}
int main() {
//结构体做函数参数
//将学生传入到一个参数中,打印学生所有信息
student s;
s.name = "大头";
s.age = 18;
s.score = 100;
cout << "main 函数中打印结果: " << s.name << s.age << s.score << endl;
//printStudent1(s);
printStudent2(&s);
system("pause");
return 0;
}
五 结构体中const使用场景
用const来防止误操作
#include
using namespace std;
#include
struct student {
int age;
string name;
int score;
};
//将函数中的形参改为指针可以减少内存空间,而且不会复制新的副本出来
//加入const后,一旦有修改就会报错,防止误操作
void print(const student *s) {
cout << s->age << s->name << s->score << endl;
}
int main() {
student s = {23,"hhh",22 };
print(&s);
system("pause");
return 0;
}
六
案例:共3个老师,每名老师有五个学生,学生存放在老师的结构体中
学生有姓名,考试分数
创建数组存放3名老师,通过函数给每个老师及其学生赋值
最终打印出老师数据和其所带学生的数据
#include
using namespace std;
#include
#include
//学生结构体
struct student {
int age;
string sname;
int score;
};
//老师结构体
struct teacher {
string tname;
struct student s[5];
};
//给老师和函数赋值的函数
void space(struct teacher x[],int len) {
string nameSeed = "ABCDE";
//给老师赋值
for (int i = 0; i < len; i++) {
x[i].tname = "Teacher_";
x[i].tname += nameSeed[i];
//给学生赋值
for (int j = 0; j < 5; j++) {
x[i].s[j].sname = "student_";
x[i].s[j].sname += nameSeed[j];
int random = rand() % 61 + 40;//40--100
x[i].s[j].score = random;
}
}
}
//打印
void print(struct teacher y[],int len){
for (int i = 0; i < len; i++) {
cout << "老师姓名: " << y[i].tname << endl;
for (int j = 0; j < 5; j++) {
cout << "\t学生姓名: " << y[i].s[j].sname << " \t分数: " << y[i].s[j].score << endl;
}
}
}
int main() {
//随机数种子
srand((unsigned int)time(NULL));
//老师数组
struct teacher tarr[3];
//通过函数给每个老师及其学生赋值
int len = sizeof(tarr) / sizeof(tarr[0]);
space(tarr, len);
//打印
print(tarr, len);
system("pause");
return 0;
}
案例二
设计一个英雄的结构体,包括姓名,年龄,性别
创建结构体数组,数组中存放5名英雄
通过冒泡排序,将数组中的英雄按照年龄升序排序,最后打印
#include
using namespace std;
#include
#include
//英雄结构体
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 < 5 - i - 1; j++) {
if (heroArray[j].age > heroArray[j + 1].age) {
struct Hero temp = heroArray[j];//临时变量保存结构体元素
heroArray[j] = heroArray[j + 1];
heroArray[j + 1] = temp;
}
}
};
};
void print(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() {
//创建数组存放英雄
struct Hero heroArray[5] = {
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"}
};
int len = sizeof(heroArray) / sizeof(heroArray[0]);
//对数组进行排序
bubbleSort(heroArray, len);
//打印
print(heroArray, len);
system("pause");
return 0;
}