结构体
结构体基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
结构体定义和使用
语法
struct 结构体名 {结构体成员列表};
通过结构体创建变量的方式
-
struct 结构体名 变量名
-
struct 结构体名 变量名 = {成员1值 , 成员2值…}
-
定义结构体时顺便创建变量
注意1:通常情况下,默认使用
struct 结构体名 变量民和struct 结构体名 变量名 = {数值} 方式创建变量注意2:创建变量时,可以省略 struct 关键字,但是声明结构体时,必须有 struct
x
using namespace std;
//1、创建学生数据类型
struct Student
{
//姓名
string name;
//年龄
int age;
//分数
int score;
}
//3、定义结构体时顺便创建变量
s3;
int main() {
//2、通过学生类型创建具体学生
//struct 数据类型 变量名
struct Student s1;
s1.name = "小王";
s1.age = 30;
s1.score = 80;
cout << "姓名:" << s1.name <<
" 年龄:" << s1.age <<
" 成绩:" << s1.score <<
endl;
//struct 数据类型 变量名 = {数值}
struct Student s2 = { "小宋",40,60 };
cout << "姓名:" << s2.name <<
" 年龄:" << s2.age <<
" 成绩:" << s2.score <<
endl;
//3、定义结构体时顺便定义变量
s3.name = "小马";
s3.age = 18;
s3.score = 3;
cout << "姓名:" << s3.name <<
" 年龄:" << s3.age <<
" 成绩:" << s3.score <<
endl;
//创建变量时,可以不带 struct 关键词
Student s4;
s4.name = "张三";
s4.age = 108;
s4.score = 100;
cout << "姓名:" << s4.name <<
" 年龄:" << s4.age <<
" 成绩:" << s4.score <<
endl;
system("pause");
return 0;
}
运行

结构体数组
作用:将自定义的结构体放入到数组种方便维护
语法:
xxxxxxxxxx
struct 结构体名 数组名 [元素个数] = { {}, {}, ... {}}
xxxxxxxxxx
using namespace std;
//结构体数组
//1、定义结构体
struct Student
{
//姓名
string name;
//年龄
int age;
//成绩
int score;
};
int main() {
//2、创建结构体数组
struct Student StudentArray[] =
{
{"小马",18,22},
{"小宋",44,58},
{"小王",30,96}
};
//输出该结构体数组中的元素
for (int i = 0; i < 3; i++)
{
cout
<< "姓名:" << StudentArray[i].name
<< " 年龄:" << StudentArray[i].age
<< " 成绩:" << StudentArray[i].score
<< endl;
}
cout << endl;
//3、给结构体数组中的元素赋值
StudentArray[2].name = "大马";
StudentArray[2].age = 20;
StudentArray[2].score = 32;
//4、遍历结构体数组
for (int i = 0; i < 3; i++)
{
cout
<< "姓名:" << StudentArray[i].name
<< " 年龄:" << StudentArray[i].age
<< " 成绩:" << StudentArray[i].score
<< endl;
}
system("pause");
return 0;
}
运行

结构体指针
作用:通过指针访问结构体中的成员
-
利用操作符
->可以通过结构体指针访问结构体属性
xxxxxxxxxx
using namespace std;
//结构体指针
//定义学生结构体
struct Student
{
//姓名
string name;
//年龄
int age;
//成绩
int score;
};
int main() {
//创建学生结构体变量
struct Student s1 = { "小马",18,20 };
//通过指针指向结构体变量
Student* p = &s1;
//通过指针访问结构体变量属性
cout
<< "姓名:" << p->name
<< " 年龄:" << p->age
<< " 成绩:" << p->score
<< endl;
system("pause");
return 0;
}
运行

结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
xxxxxxxxxx
using namespace std;
//学生结构体
struct Student {
//学生姓名
string name;
//学生年龄
int age;
//学生成绩
int score;
};
//教师结构体
struct Teacher {
//教师姓名
string name;
//教师年龄
int age;
//教师ID
int id;
//辅导的学生
struct Student Stu;
};
int main()
{
//创建教师结构体
Teacher t1 = {"小马",18,1000};
//打印教师的信息
cout
<< "教师姓名:" << t1.name
<< " 教师年龄:" << t1.age
<< " 教师ID:" << t1.id
<< '\n' << endl;
//写入教师 小马 中的学生信息
t1.Stu = { "小宋",40,22 };
//打印学生的信息
cout
<< "学生姓名:" << t1.Stu.name
<< " 学生年龄:" << t1.Stu.age
<< " 学生成绩:" << t1.Stu.score
<< '\n' << endl;
system("pause");
return 0;
}
运行

结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
-
值传递
-
地址传递
xxxxxxxxxx
using namespace std;
//定义学生结构体
struct Student {
//姓名
string name;
//年龄
int age;
//成绩
int score;
};
//值传递
void printStudent01(struct Student stu) {
stu.name = "张三";
stu.age = 6;
stu.score = 120;
cout << "值传递修改后的学生信息:" << '\n'
<< "姓名:" << stu.name
<< " 年龄:" << stu.age
<< " 成绩:" << stu.score
<< endl;
}
//地址传递
void printStudent02(struct Student *p) {
p->name = "李四";
p->age = 18;
p->score = 80;
cout << "引用传递修改后的学生信息:" << '\n'
<< "姓名:" << p->name
<< " 年龄:" << p->age
<< " 成绩:" << p->score
<< endl;
}
int main(){
//创建学生结构体
struct Student s1 = { "小马",66,10 };
cout << "修改之前的学生信息:" << '\n'
<< "姓名:" << s1.name
<< " 年龄:" << s1.age
<< " 成绩:" << s1.score
<< '\n' << endl;
//调用值传递的函数
printStudent01(s1);
//输出值传递函数之后,原学生结构体的数值
cout << "值传递修改后的原学生信息:" << '\n'
<< "姓名:" << s1.name
<< " 年龄:" << s1.age
<< " 成绩:" << s1.score
<< '\n' << endl;
//调用地址传递的函数
printStudent02(&s1);
//输出地址传递函数后,原学生结构体的数值
cout << "地址传递修改后的原学生信息:" << '\n'
<< "姓名:" << s1.name
<< " 年龄:" << s1.age
<< " 成绩:" << s1.score
<< endl;
system("pause");
return 0;
}
运行

结构体中 const 使用场景
作用:用 const 来防止误操作
注意:将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
xxxxxxxxxx
void printStudent(const struct Student* p) {
p->age = 20;
}
报错

使用 const 修饰的结构体无法在该函数中修改其值
案例 – 1
案例描述:
学校正在做毕设项目,每名老师带领 5 个学生,总共有 3 名老师
设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放 5 名学生的数组作为成员
学生的成员有姓名、考试分数、创建数组存放 3 名老师,通过函数给每个老师及所带的学生赋值
最终打印出老师数据以及老师所带的学生数据
xxxxxxxxxx
using namespace std;
//定义学生结构体
struct Student {
string name;
int score;
};
//定义教师结构体
struct Teacher {
string name;
struct Student sArray[5];
};
void set(struct Teacher *Tp,int ArrayLenght) {
srand((unsigned int)(time(NULL)));
struct Teacher* Tp2 = NULL;
Tp2 = Tp;
struct Student* Sp = NULL;
struct Student* Sp2 = NULL;
for (int i = 0; i < ArrayLenght; i++)
{
Tp2 = Tp;
Tp2 += i;
Tp2->name = "Teacher_" + to_string(i);
int studentArrayLenght =
(int)sizeof(Tp->sArray) / (int)sizeof(Tp->sArray[0]);
Sp = &(Tp2->sArray[0]);
for (int j = 0; j < studentArrayLenght ; j++)
{
Sp2 = Sp;
Sp2 += j;
Sp2->name = "Teacher_" + to_string(i) + " Student_" + to_string(j);
Sp2->score = rand();
}
}
}
void print(struct Teacher *Tp,int teacherArrayLenght) {
struct Student* Sp = NULL;
struct Teacher* Tp2 = NULL;
for (int i = 0; i < teacherArrayLenght; i++)
{
Tp2 = Tp;
Tp2 += i;
cout << Tp2->name << " 的学生有:" << endl;
for (int j = 0; j < 5; j++)
{
Sp = &(Tp2->sArray[0]);
Sp += j;
cout << "学生姓名:" << Sp->name << " 成绩为:" << Sp->score << endl;
}
cout << endl;
}
}
int main() {
struct Teacher tArray[3];
struct Teacher* Tp = NULL;
struct Student* Sp = NULL;
Tp = &tArray[0];
int teacherArrayLenght = (int)sizeof(tArray) / (int)sizeof(tArray[0]);
set(Tp,teacherArrayLenght);
print(Tp, teacherArrayLenght);
system("pause");
return 0;
}
运行

案例 – 2
设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放 5 名英雄。
通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。
xxxxxxxxxx
using namespace std;
struct Hero {
string name;
int age;
string sex;
};
void sort(Hero *heroP,int heroArrayLenght){
struct Hero* heroP2 = NULL;
struct Hero temp;
for (int i = 0; i < heroArrayLenght; i++)
{
heroP2 = heroP;
for (int j = 0; j < heroArrayLenght - i - 1; j++)
{
if (heroP2->age > (heroP2 + 1)->age)
{
temp = *heroP2;
*heroP2 = *(heroP2 + 1);
*(heroP2 + 1) = temp;
}
heroP2 = heroP;
heroP2 += j + 1;
}
}
}
void print(Hero *heroP,int heroArrayLenght) {
struct Hero* heroP2 = NULL;
heroP2 = heroP;
for (int i = 0; i < heroArrayLenght; i++)
{
cout << "姓名:" << heroP2->name
<< " 年龄:" << heroP2->age
<< " 性别:" << heroP2->sex
<< endl;
heroP2 = heroP;
heroP2 += i + 1;
}
}
int main() {
srand((unsigned int)time(NULL));
struct Hero heroArray[6] = {
{"小马",rand() % 150,"女"},
{"小王",rand() % 150,"男"},
{"小宋",rand() % 150,"男"},
{"小潘",rand() % 150,"女"},
{"小西",rand() % 150,"男"},
{"小武",rand() % 150,"男"}
};
int heroArrayLenght = (int)sizeof(heroArray) / (int)sizeof(heroArray[0]);
struct Hero* heroP = &(heroArray[0]);
sort(heroP, heroArrayLenght);
print(heroP, heroArrayLenght);
system("pause");
return 0;
}
运行
