结构体概念
属于用户自己定义的数据类型,允许用户储存不同类型的数据
定义结构体语法
struct 结构体名 {结构成员列表(即结构体属性)}
定义中的struct不可省略,其他地方的可以省略
案例:创建学生结构体
三种定义结构体的方法
"."用来访问结构体属性
#include<iostream>
#include<string>
using namespace std;
struct Student //定义结构体
{
string name;
int age;
int weight;
};
int main()
{
//创建结构体变量
//使用三种不同方法创建三个变量
//1.
struct Student s1;//创建变量
s1.name = "小明";//给变量赋值
s1.age = 18;
s1.weight = 52;
//2.
struct Student s2 = { "小红",18,45 };//创建变量时定义初始值
//3.
//定义时创建结构体变量
//struct Student //定义结构体
//{
// string name;
// int age;
// int weight;
//}s3;
//s1.name = "小亮"; //给变量赋值
//s1.age = 18;
//s1.weight = 55;
return 0;
}
结构体数组
作用:当变量较多时,将结构体放入数组中方便维护
#include<iostream>
#include<string>
using namespace std;
struct Student //定义结构体
{
string name;
int age;
int weight;
};
int main()
{
struct Student stuarr[3] = {
{"小明",18,52},
{"小红",18,45},
{"小亮",18,55}
};
//可以给数组中的元素重新赋值
stuarr[0] = { "小刚",18,54 };
//遍历数组结构体
for (int i = 0; i < 3; i++)
{
cout << stuarr[i].name << stuarr[i].age << stuarr[i].weight << endl;
}
return 0;
}
结构体指针
作用:通过指针访问结构体中的成员
操作符"->"可通过结构体指针访问结构体属性
//创建疫情病例的结构体
#include<iostream>
#include<string>
using namespace std;
struct eg //定义结构体
{
string name;
int age;
};
int main()
{
struct eg e = {"张三",55};
//指针指向结构体
struct eg* p = &e;
//指针访问结构体
cout << p->name << p->age << endl;
return 0;
}
结构体嵌套
定义结构体时先定义内层结构体再定义外层(从内到外)
//案例:学校举办一对多辅导活动,登记赵老师辅导小明和小亮的信息
#include<iostream>
#include<string>
using namespace std;
struct student//定义学生结构体
{
string name;
int score;
};
struct teacher //定义老师结构体
{
string id;
string subject;
struct student s[2];//创建学生结构体变量 即 嵌套结构体
};
int main()
{
struct teacher t;
t.id = "007";
t.subject = "数学";
t.s[0].name = "小明";
t.s[0].score = 67;
t.s[1].name = "小亮";
t.s[1].score = 75;
cout << t.id << t.subject << t.s[0].name << t.s[0].score << t.s[1].name
<< t.s[1].score << endl;
return 0;
}
结构体做函数参数
//案例:打印学生信息
#include<iostream>
#include<string>
using namespace std;
struct student//定义学生结构体
{
string name;
int score;
};
//值传递(改变形参的同时不改变实参)
void ptintf_student(struct student s)
{
cout << s.name << endl << s.score << endl;
}
//地址传递(改变形参的同时改变实参)
void printf_student2(struct student* p)
{
cout << p->name << endl << p->score << endl;
}
int main()
{
struct student s;
s.name = "小明";
s.score = 60;
ptintf_student(s);
printf_student2(&s);
return 0;
}
使用const修饰结构体中数据的场景
作用:防止误操作
在向函数传入参数的过程中,为防止占用内存过多,不适用值传递使用地址传递(即定义指针变量做参数).但是地址传递的特点是,改变形参的同时改变实参.所以为了防止误操作在定义参数列表时用const修饰指针变量.
如:
void printfstudent(const struct student *p)