前言
结构体的学习汇总,以及我对结构体理解。
结构体
`
一、结构体是什么?
结构体属于用户自定义的数据类型,允许用户储存不同类型数据。
你之前用的都是别人定义的类型,学了结构体可以你自己来定义,提高了代码的维护效率。
二、结构体的定义和使用
1.结构体定义
语法结构: struct 结构体名{定义的成员列表};
用结构体创建变量的方法
- struct 结构体名 变量名
- struct 结构体名 变量名 ={1号成员变量;2号成员变量…}
- 创建结构体顺便创建变量
代码如下(示例):
#include<bits/stdc++.h>
using namespace std;
struct student
{
//成员创建
string name;
int age;
int score;
}stu3;//第三种方式 看这里第三种 看这里第三种 看这里第三种
int main(){
//第一种方式
struct student stu1;//在c++里struct可以省略,正能在main函数里面省略
stu1.name="afana";
stu1.age=19;
stu1.score=100;
cout<<"名字:"<<stu1.name<<" 年龄:"<<stu1.age<<" 分数:"<< stu1.score<<endl;
//第二种方式
student stu2={"ayuana",18,100};
cout<<"名字:"<<stu2.name<<" 年龄:"<<stu2.age<<" 分数:"<< stu2.score<<endl; //想比与string name.1="ayuana";int age.1;int score.1;要更加的快捷e
//第三种很容易被忽略,减低代码的可读性,自定义结构体的}后面直接定义stu3
stu3.name="azhuoa";
stu3.age=10;
stu3.score=90;
cout<<"名字:"<<stu3.name<<" 年龄:"<<stu3.age<<" 分数:"<< stu3.score<<endl;
return 0;
}
2.结构体数组
作用:方便后期的维护
创建方法: struct student ={ {},{},{},{}…};
代码如下(示例):
#include<bits/stdc++.h>
using namespace std;
struct student
{
//成员创建
string name;
int age;
int score;
};
int main(){
struct student arr[3]=
{
{"afana",19,100},
{"ayauna",18,100},
{"azhuoa",10,90}
}; //和数组一样 a[3]={1,2,3};
for(int i=0;i<3;i++){
cout<<"名字:"<< arr[i].name<<" 年龄:"<<arr[i].age<<" 分数:"<< arr[i].score<<endl;
}
return 0;
}
3.结构体指针
作用:通过指针访问结构体成员
访问方法
1.定义指针
2.通过->符号访问`
#include<bits/stdc++.h>
using namespace std;
struct student
{
//成员创建
string name;
int age;
int score;
};
int main(){
struct student stu= {"afana",19,100};
struct student * p= &stu;//把stu的地址赋值给指针
cout<<"名字:"<< p->name<<" 年龄:"<< p->age<<" 分数:"<< p->score<<endl;
return 0;
}
4.结构体的嵌套
作用:把成员定义为结构体 (自我感觉是提高了结构体的容量,像俄罗斯套娃一样)
#include<bits/stdc++.h>
using namespace std;
struct student
{
//成员创建
string name;
int age;
int score;
};
struct teacher
{
//成员创建
int id;//老师的职工号
string name;
int age;
struct student stu;//跟老师学习的学生,在teacher结构体中嵌套了student结构体
};
int main(){
struct teacher s;
s.id=1001;
s.age =27;
s.name="he";
s.stu.name="afana";
s.stu.age=19;
s.stu.score=100;
cout<<"老师id:"<<s.id<<" 年龄:"<< s.age<<" 老师名字"<< s.name<<endl;
cout<<"学生名字:"<< s.stu.name<<" 年龄:"<< s.stu.age<<" 分数:"<< s.stu.score<<endl;
return 0;
}
5.结构体做函数参数
作用:提高编码效率
/ /地址传递更加节省内存
#include<bits/stdc++.h>
using namespace std;
struct student
{
//成员创建
string name;
int age;
int score;
};
void printf(struct student stu)
{
stu.age=119;//局部变量
cout<<"名字:"<<stu.name<<" 年龄:"<<stu.age<<" 分数:"<< stu.score<<endl;
};
void printf2(struct student stu)
{
cout<<"名字:"<<stu.name<<" 年龄:"<<stu.age<<" 分数:"<< stu.score<<endl;
};
void printf3(struct student * p)//传入的参数类型要相同
{
cout<<"名字:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<< p->score<<endl;
};
int main(){
struct student stu;
stu.name="afana";
stu.age=19;
stu.score=100;
printf(stu);//值传递 ,不改变全局变量的值 ,peintf函数中定义年龄为119岁,但main函数中奈年龄变
printf2(stu);
printf3(&stu);//地址传递 , 会改变全局变量
cout<<"main"<<"名字:"<<stu.name<<" 年龄:"<<stu.age<<" 分数:"<< stu.score<<endl;
return 0;
}
6.结构体+const
作用:提高代码的安全性和保密性
值传递不会改变实参,但地址传递会改变,为了防止数据被胡乱修改,将结构体和const结合起来使用
//值传递相当于把数据拷贝了一份过去,所以不会改变原来的数据,拷贝的数据和原数据分开,怎么乱来都不会修改数据
/ /地址传递更加节省内存,指针只会占4个字节
#include<bits/stdc++.h>
using namespace std;
struct student
{
//成员创建
string name;
int age;
int score;
};
void printf1(struct student * p)//传入的参数类型要相同
{
p->age=150;
cout<<"名字:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<< p->score<<endl;
};
void printf2(const student * p)//这样加了const后就不会被修改了,因为被修改会报错
{
//p->age=150;不信把这个加上试试
cout<<"名字:"<<p->name<<" 年龄:"<<p->age<<" 分数:"<< p->score<<endl;
};
int main(){
struct student stu= {"afana",19,100};
struct student * p= &stu;//把stu的地址赋值给指针
printf2(p);
printf1(p);
cout<<"名字:"<< p->name<<" 年龄:"<< p->age<<" 分数:"<< p->score<<endl;
return 0;
}
总结
学会了结构体就可以试试写一个,学生信息管理系统了。