结构体
结构体的定义和使用
(1)结构体基本概念:
结构体属于用户自定义的数据类型,允许用户存储不同数据类型。
语法:struct 结构体名{ 结构体成员列表};
通过结构体创建变量的方法:
struct 结构体名 变量名
struct 结构体名 变量名={成员1,成员2…};
定义结构体时顺便创建变量
例如我们想创建一个学生的结构体:
使用第一种方法:struct 结构体名 变量名 在c++中创建变量时的struct可以省略,但是刚开始定义结构体时的struct不可省略
#include <iostream>
using namespace std;
struct student
{
int age;
string name;
int score;
int num;
};
int main()
{
student S;//通过学生类创建具体学生,struct可以省略
S.age=18;//使用 . 来访问属性
S.name="Tony";
S.num=123456;
S.score=60;//给S赋值
cout<<"学生姓名为"<<S.name<<"年龄"<<S.age<<"电话号"<<S.num<<"成绩"<<S.score<<endl;
}
第二种方法:
struct 结构体名 变量名={成员1,成员2…};
#include <iostream>
using namespace std;
struct student
{
int age;
string name;
int score;
int num;
};
int main()
{
student S2{18,"Tony",60,123456};//按照上面定义的顺序赋值
cout<<"学生姓名为"<<S2.name<<"年龄"<<S2.age<<"电话号"<<S2.num<<"成绩"<<S2.score<<endl;
}
第三种方法:
定义结构体时顺便创建变量
#include <iostream>
using namespace std;
struct student
{
int age;
string name;
int score;
int num;
}S3;//结构体创建完后顺便创建变量
int main()
{
S3.age=18;//使用 . 来访问属性
S3.name="Tony";
S3.num=123456;
S3.score=60;//给S赋值
cout<<"学生姓名为"<<S3.name<<"年龄"<<S3.age<<"电话号"<<S3.num<<"成绩"<<S3.score<<endl;
}
结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名[元素个数]={ {},{},… }
#include <iostream>
using namespace std;
struct student//定义结构体
{
int age;
string name;
int score;
};
int main()
{
student arr[3]=
{
{18,"Taony",80},
{12,"Tsony",44},
{14,"Tcony",98}
};//创建结构体数组
arr[1].age=166;
arr[1].name="zeyuan";
arr[1].score=100;//修改数据;
int len=sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<len;i++)//遍历结构体
{
cout<<arr[i].age<<endl;
cout<<arr[i].name<<endl;
cout<<arr[i].score<<endl;
}
}
结构体指针
作用:通过指针来访问结构体中的成员
#include <iostream>
using namespace std;
struct student//定义结构体
{
int age;
string name;
int score;
};
int main()
{
student s1{18,"Tony",90};
student *p=&s1;//s1是属于student的结构体 所以定义指针p的时候应该也是student修饰
//通过指针指向结构体变量
cout<<"年龄为"<<p->age<<endl;//利用操作符 -> 可以通过结构体指针来访问结构体属性
cout<<"姓名为"<<p->name<<endl;
cout<<"成绩为"<<p->score<<endl;
}
结构体嵌套结构体
作用:结构体成员中可以有另一个结构体
这在学习数据结构中会经常使用
#include <iostream>
using namespace std;
struct student//定义学生结构体
{
int age;//学生年龄
string name;//学生姓名
int score;//学生分数
};
struct teacher//定义老师结构体
{
int age;//老师年龄
string name;//老师姓名
struct student s1;//老师带的学生s1
};
//注意学生应该定义在老师的前面
int main()
{
teacher t1;
t1.age=30;
t1.name="laowang";
t1.s1.age=18; //老师结构体中的s1也是属于student的结构体 需要赋值
t1.s1.name="Tony";
t1.s1.score=100;
cout<<"老师姓名为"<<t1.name<<endl;
cout<<"老师年龄为"<<t1.age<<endl;
cout<<"老师教的学生的姓名为"<<t1.s1.name<<endl;
cout<<"老师教的学生的年龄为"<<t1.s1.age<<endl;
cout<<"老师教的学生的成绩为"<<t1.s1.score<<endl;
}
结构体作函数参数
前面文章中指针中可以实现地址传递,即可以改变实参的值。
#include <iostream>
using namespace std;
struct student//定义学生结构体
{
int age;//学生年龄
string name;//学生姓名
int score;//学生分数
};
//值传递
void printstudent(student s)
{
cout<<"值传递中姓名"<<s.name<<"年龄"<<s.age<<"分数"<<s.score<<endl;
}
//地址传递
void printstudent1(student *p)//用指针去接收一个地址
{
p->age=100;
cout<<"地址传递中姓名"<<p->name<<"年龄"<<p->age<<"分数"<<p->score<<endl;
}
int main()
{
student s1;//创建结构体变量
//现在要把学生传到一个参数里打印学生的所有信息
s1.age=18;
s1.name="Tony";
s1.score=100;
cout<<"main中姓名"<<s1.name<<"年龄"<<s1.age<<"分数"<<s1.score<<endl;
// printstudent(s1);
printstudent1(&s1);//地址:&
}
地址传递 形参改变后实参的值也改变 以上代码中年龄改为100 后main函数中的年龄和printstudent1函数中的年龄都为100.
结构体中的const的使用场景
上一个代码说到地址传递可以修改实参的值,为了防止修改实参的值 可以在student s前面加上一个const来防止误操作
#include <iostream>
using namespace std;
struct student//定义学生结构体
{
int age;//学生年龄
string name;//学生姓名
int score;//学生分数
};
void println(const student *s)
{
//s->score=60;
cout<<"姓名"<<s->name<<"年龄"<<s->age<<"分数"<<s->score<<endl;
}
int main()
{
student s1;//创建结构体变量
s1.age=18;
s1.name="Tony";
s1.score=100;
//通过函数打印信息:
println(&s1);
}
如果println函数中s->score=60解除注释并运行可以得到
说明读是可以的,数据是不可以修改的。一旦有误操作就会报错。