0x01
结构体的概念
结构体属于用户自定义的数据类型,允许储存不同的数据类型
0x02
结构体的定义与使用
格式:
struct 结构体名{结构体变量1; 结构体变量2;}
结构体创建方式:
- struct student s1;
- struct student s2 = { … };
- 在创建结构体的时候创建结构体变量
struct student { … }s3;
Example:
#include<bits/stdc++.h>
using namespace std;
struct student{
string name; //姓名
int age; //年龄
int score; //分数
};
struct Student{
string name; //姓名
int age; //年龄
int score; //分数
}s3; //结构体创建方式3
int main(){
struct student s1; //结构体创建方式1
s1.name = "阿健";
s1.age = 19;
s1.score = 95;
cout<<"姓名:"<<s1.name<<endl;
cout<<"年龄:"<<s1.age<<endl;
cout<<"分数:"<<s1.score<<endl;
struct student s2 = {"阿焦",20,99}; //结构体创建方式2
cout<<"姓名:"<<s2.name<<endl;
cout<<"年龄:"<<s2.age<<endl;
cout<<"分数:"<<s2.score<<endl;
s3.name = "阿卓";
s3.age = 21;
s3.score = 90;
//结构体创建方式3 top
cout<<"姓名:"<<s3.name<<endl;
cout<<"年龄:"<<s3.age<<endl;
cout<<"分数:"<<s3.score<<endl;
return 0;
}
0x03
结构体数组
作用:
将自定义的结构体放入数组中方便维护
格式:
struct 结构体名 数组名[ 元素个数 ] = { {}, {},… , {} } ;
Example:
#include<bits/stdc++.h>
using namespace std;
struct student{
string name; //姓名
int age; //年龄
int score; //分数
};
int main(){
//创建结构体数组
struct student stuArray[3]=
{
{"阿健",19,95},
{"阿焦",20,99},
{"阿卓",21,90}
};
//遍历结构体数组
for(int i=0;i<3;i++){
cout<<"姓名:"<<stuArray[i].name<<endl;
cout<<"年龄:"<<stuArray[i].age<<endl;
cout<<"分数:"<<stuArray[i].score<<endl;
cout<<"------------------------" <<endl;
}
//给结构体数组中的元素赋值
stuArray[1].name = "阿霖" ;
stuArray[1].age = 21;
stuArray[1].score = 100;
printf("\n");
printf("####改数据后结果为:####\n");
printf("\n");
for(int i=0;i<3;i++){
cout<<"姓名:"<<stuArray[i].name<<endl;
cout<<"年龄:"<<stuArray[i].age<<endl;
cout<<"分数:"<<stuArray[i].score<<endl;
cout<<"------------------------" <<endl;
}
}
0x04
结构体指针
作用:
通过指针访问结构体中的成员
- 利用操作符-> 可以通过结构体指针访问结构体属性
Example:
#include<bits/stdc++.h>
using namespace std;
struct student{
string name; //姓名
int age; //年龄
int score; //分数
};
int main(){
//创建结构体变量
struct student s = {"阿健",19,95};
//创建结构体指针
struct student* p = NULL;
//通过指针指向结构体变量
p = &s;
//通过指针访问结构体变量中的数据
cout<<"姓名:"<<p->name<<endl;
cout<<"年龄:"<<p->age<<endl;
cout<<"分数:"<<p->score<<endl;
}
0x05
结构体嵌套结构体
作用:
结构体中的成员可以是另一个结构体
例如
每个指导老师负责自己的学生:一个老师的结构体中记录一个学生的结构体
Example
#include<bits/stdc++.h>
using namespace std;
// 定义学生结构体
struct student{
string name;
int age;
int score;
};
// 定义老师结构体
struct teacher{
int id;
string name;
struct student stu;
};
int main(){
//结构体嵌套结构体
//创建老师
teacher t;
t.id=10000;
t.name="Ms.Z" ;
t.stu.name="Danny";
t.stu.age=18;
t.stu.score=134;
cout<<"教师姓名:" <<t.name<<endl;
cout<<"教师编号:"<<t.id<<endl;
cout<<"教师辅导学生的名字:"<<t.stu.name<<endl;
cout<<"教师辅导学生的年龄:"<<t.stu.age<<endl;
cout<<"教师辅导学生的分数:"<<t.stu.score<<endl;
return 0;
}
0x06
结构体作为函数参数
作用:
将结构体作为参数向函数中传递
传递方式:
- 值传递
- 地址传递
Example
#include<bits/stdc++.h>
using namespace std;
// 定义学生结构体
struct student{
string name;
int age;
int score;
};
// 打印学生信息
// 值传递
printfStudent1(struct student s){
s.age=1900;
cout<<"函数1中的姓名:" <<s.name<<endl;
cout<<"年龄:" <<s.age<<endl;
cout<<"分数:" <<s.score<<endl;
}
// 地址传递
printfStudent2(struct student *p){
p->age=20;
cout<<"函数2中的姓名:" <<p->name<<endl;
cout<<"年龄:" <<p->age<<endl;
cout<<"分数:" <<p->score<<endl;
}
int main(){
//结构体做函数参数
//将学生传入到一个参数中,打印学生的所有信息
struct student s;
s.name="Danny";
s.age=18;
s.score=134;
printfStudent1(s);
printf("\n************改变值以后************\n\n");
cout<<"函数1中的姓名:" <<s.name<<endl;
cout<<"年龄:" <<s.age<<endl;
cout<<"分数:" <<s.score<<endl;
printf("\n");
printfStudent2(&s);
printf("\n************改变值以后************\n\n");
cout<<"函数2中的姓名:" <<s.name<<endl;
cout<<"年龄:" <<s.age<<endl;
cout<<"分数:" <<s.score<<endl;
}
const使用场景:
防止误操作
// 将函数中的参数改为指针,可以减少内存空间
// 值传递数据多占存大 一个指针只占用四个字节大小
void printfStudent2(struct student *p){
p->age=20;