1、结构体的定义和简单使用
定义结构体一定要用 struct+类型名称
//结构体的定义和简单使用
#include<iostream>
#include <string>
using namespace std;
//1、创建学生数据类型:学生包括(姓名,年龄,分数)
//自定义的数据类型,一些类型的集合组成的一个类型
//语法 struct 类型名称{ 成员列表}
struct Student
{
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
}s3; //顺便创建结构体变量
//2、通过学生类型创建具体学生
int main()
{
//2.1 struct Student s1
//struct关键字可以省略
Student s1;
//给s1属性赋值,通过一个 . 访问结构体变量中的属性
s1.name = "张三";
s1.age = 18;
s1.score = 100;
cout << "姓名:" << s1.name << "年龄:" << s1.age << "分数:" << s1.score << endl;
//2.2 struct Student s2={ ...}
struct Student s2 = { "李四",19 ,80 };
cout << "姓名:" << s2.name << "年龄:" << s2.age << "分数:" << s2.score << endl;
//2.3 在定义结构体时顺便创建结构体变量
s3.name = "王五";
s3.age = 20;
s3.score = 60;
cout << "姓名:" << s3.name << "年龄:" << s3.age << "分数:" << s3.score << endl;
return 0;
}
简单地理解结构体:
结构体就相当于人,像结构体里的name、age、score相当于人的信息,如果要具体到一个人的话,就在函数里面将这些信息进行赋值。
在函数里面要先声明一下结构体,不过在函数里面,struct就可以省略,以上代码里一共有三种改变结构体变量的方法。
在访问结构体里面的成员都是通过“.”来访问的。
2、结构体数组
//结构体数组
#include<iostream>
using namespace std;
#include <string>
//结构体数组
//1、定义结构体
struct Student
{
//姓名、
string name;
//年龄
int age;
//分数
int score;
};
int main() {
//2、创建结构体数组
struct Student stuArray[3] =
{
{"张三",18,100},
{"李四",28,99},
{"王五",38,66}
};
//3、给结构体数组中的元素赋值
stuArray[2].name = "赵六";
stuArray[2].age = 80;
stuArray[2].score = 60;
//4、遍历结构体数组
for (int i = 0; i < 3; i++)
{
cout << "姓名:" << stuArray[i].name
<< "年龄: " << stuArray[i].age
<< "分数:" << stuArray[i].score << endl;
}
return 0;
}
结构体数组可以理解为:
一位老师相当于结构体数组,里面的成员相当与老师的学生,其中,里面的每一个成员都是一个结构体。
3、结构体指针
//结构体指针
#include<iostream>
using namespace std;
#include <string>
//结构体指针
//定义学生结构体
struct student
{
string name;//姓名
int age;//年龄
int score;//分数
};
int main() {
//1、创建学生结构体变量
student s = { "张三" , 18 , 100 };
//2、通过指针指向结构体变量
student* p = &s;
//3、通过指针访问结构体变量中的数据
//通过结构体指针 访问结构体中的属性,需要利用‘->’
cout << "姓名:" << p->name << "年龄:" << p->age << "分数:" << p->score << endl;
return 0;
}
在结构体里运用指针时,如果要访问结构体里的属性,就要用到“->”。
4、结构体嵌套结构体
//结构体嵌套结构体
#include<iostream>
using namespace std;
#include <string>
//定义学生的结构体
struct student
{
string name;//姓名
int age;//年龄
int score;//分数
};
//定义老师结构体
struct teacher
{
int id; //教室编号
string name;//教师姓名
int age;//教师年龄
struct student stu;//辅导的学生
};
int main() {
//结构体嵌套结构体
//创建老师
teacher t;
t.id = 10000;
t.name = "老王";
t.age = 50;
t.stu.name = "小王";
t.stu.age = 20;
t.stu.score = 60;
cout << "老师姓名:" << t.name << "老师编号:" << t.id << "老师年龄:" << t.age
<< "老师辅导的学生姓名:" << t.stu.name << "学生年龄:" << t.stu.age
<< "学生考试分数为:" << t.stu.score << endl;
return 0;
}
结构体嵌套结构体可以拿函数中嵌套函数来类比,一个结构体当成老师,老师手中有几份信息表(结构体的里面的成员),包括老师自己的信息和学生的信息表,而学生是一个结构体,学生又有几个信息。
5、结构体做函数参数
//结构体做函数参数
#include<iostream>
using namespace std;
#include <string>
//定义学生结构体
struct student
{
//姓名
string name;
//年龄
int age;
//分数
int score;
};//打印学生信息的函数
//1、值传递
void printStudent1(struct student s)
{
cout << "子函数中 姓名: " << s.name << "年龄: " << s.age << "分数: " << s.score << endl;
}
//2、地址传递
void printStudent2(struct student *p)
{
cout << "子函数2中 姓名: " << p->name << "年龄: " << p->age << "分数: " << p->score << endl;
}
int main() {
//结构体做函数参数
//将学生传入到一个参数中,打印学生身上的所有信息
//创建结构体变量
struct student s;
s.name = "张三";
s.age = 20;
s.score = 85;
printStudent1(s);
printStudent2(&s);
//cout << "main函数中打印 姓名:" << s.name << "年龄:" << s.age << "分数:" << s.score << endl;
return 0;
}
结构体做函数参数与函数传参的特点差不多,不是指针传递的值是形参,指针传递的是实参。
6、结构体const的使用场景
//结构体const的使用场景
#include<iostream>
using namespace std;
#include <string>
struct student
{
//姓名
string name;
//年龄
int age;
//分数
int score;
};
//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
void printStudents(const student *s)
{
//s->age=150;//加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作
cout << "姓名: " << s->name << "年龄: " << s->age << "得分: " << s->score << endl;
}
int main() {
//创建结构体变量
struct student s = { "张三",15,70 };
//通过函数打印结构体变量信息
printStudents(&s);
cout << "main中张三年龄为:" << s.age << endl;
return 0;
}
在结构体做函数参数时,运用const可以防止我们的误操作,在函数的形参中运用指针,可以减少内存空间。