c++结构体

c++结构体

结构体的基本概念:

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。

结构体的定义和使用

  • 语法:
struct 结构体名{
	结构体成员列表;
};
  • 通过结构体创建变量的三种方式:

struct 结构体名 变量名
struct 结构体名 变量名 = {成员1,成员2…};
定义结构体是顺便创建了变量

  • 实例:
#include<iostream>
#include<string>
using namespace std;
//1.创建学生数据类型:姓名 年龄 分数
//自定义的数据类型,一些类型集合组成的一个类型
/*
语法:
struct 类型名称{
	成员列表;
};
*/
struct Student {
	//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};
/*
struct Student {
	//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
}s3; 顺便创建结构体变量
*/
//2.通过学生类型创建具体学生
/*
第一种
struct Student s1;
第二种
struct Student s2 = {.....}
第三种
在定义结构体的时候顺便创建结构体变量
*/
int main() {
    //第一种
    //结构体创建的时候struct关键字可以省略,结构体定义的时候不可以省略。
	struct Student s1;
	//给s1属性赋值,通过.访问结构体变量中的属性 
	s1.name = "张三";
	s1.age = 12;
	s1.score = 100;
	cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;
	//第二种
	//struct Student s2 = { ..... };
	struct Student s2 = { "李四",18,90 };
	cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;
	//第三种
	//在定义结构体的时候顺便创建结构体变量
	/*
	s3.name = "王五";
	s3.age = 89;
	s3.score = 89;
	cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;
	*/
	system("pause");
	return 0;
}
姓名:张三 年龄:12 分数:100
姓名:李四 年龄:18 分数:90
请按任意键继续. . .

结构体数组

  • 作用:将自定义的结构体放入数组中方便维护
  • 语法:
struct 结构体名 数组名[元素个数] = {{},{},{},.....};
  • 实例:
#include<iostream>
#include<string>
using namespace std;
//结构体数组
//1.创建一个结构体
struct Student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};
int main() {
	//2.创建一个结构体的数组
	struct Student stuArray[3] = {
		{"张三",78,89},
		{"李四",45,99},
		{"王五",45,88}
	};
	//3.给结构体中数组中的元素赋值
	stuArray[2].name = "赵六";
	stuArray[2].age = 11;
	stuArray[2].score = 99;
	//4.遍历结构体数组
	for (int i = 0; i < 3; i++) {
		cout << "姓名:" << stuArray[i].name << " 年龄:" << stuArray[i].age << " 分数:" << stuArray[i].score << endl;
	}
	system("pause");
	return 0;
}
姓名:张三 年龄:78 分数:89
姓名:李四 年龄:45 分数:99
姓名:赵六 年龄:11 分数:99
请按任意键继续. . .

结构体指针

  • 作用:通过指针访问结构体中的成员
  • 注意:利用操作符->可以通过结构体指针访问结构体属性
  • 实例:
#include<iostream>
#include<string>
using namespace std;
//结构体指针
//定义一个学生的结构体
struct student {
	string name;//姓名
	int age;//年龄
	int score;//分数
};
int main() {
	//1.创建学生的结构体变量
	struct student s = {"zhangsan",78,100};
	//2.通过指针直线结构体变量
	struct student* p = &s;
	//3.通过指针访问结构体变量中的数据
	//利用操作符->可以通过结构体指针访问结构体属性
	cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
	system("pause");
	return 0;
}
姓名:zhangsan 年龄:78 分数:100
请按任意键继续. . .

结构体嵌套结构体

  • 作用:结构体的成员可以是另一个结构体

  • 例如:每一个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

  • 分析
    在这里插入图片描述

  • 实例:

#include<iostream>
#include<string>
using namespace std;
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 = 1000;
	t.name = "老王";
	t.age = 45;
	t.stu.name = "小王";
	t.stu.age = 23;
	t.stu.score = 100;
	cout << "老师姓名:" << t.name << " 老师编号:" << t.id << " 老师年龄:" << t.age << " 学生姓名:" << t.stu.name << " 学生的年龄: " << t.stu.age << " 学生的考试分数:" << t.stu.score << endl;
	system("pause");
	return 0;
}
老师姓名:老王 老师编号:1000 老师年龄:45 学生姓名:小王 学生的年龄: 23 学生的考试分数:100
请按任意键继续. . .

结构体做函数参数

  • 作用:将结构体作为参数向函数中传递
  • 传递方式

值传递
地址传递

  • 实例:
#include<iostream>
#include<string>
using namespace std;
struct student {
	//定义学生的结构体
	string name;//学生姓名
	int age;//学生年龄
	int score;//学生分数
};
//1.值传递
void printStudent1(struct student s) {
	s.age = 123;
	cout << "printStudent1函数中:" << " 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;
}
//2.地址传递
void printStudent2(struct student * p) {
	p->age = 200;
	cout << "printStudent2函数中:" << " 姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
}
int main() {
	//结构体作为函数的参数
	//将学生传入一个参数中,打印学生上的所有信息
	//创建结构体变量
	struct student s;
	s.name = "张三";
	s.age = 12;
	s.score = 90;
	cout << "main()函数中打印结果:" << " 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl;
	printStudent1(s);
	printStudent2(&s);
	system("pause");
	return 0;
}
main()函数中打印结果: 姓名:张三 年龄:12 分数:90
printStudent1函数中: 姓名:张三 年龄:123 分数:90
printStudent2函数中: 姓名:张三 年龄:200 分数:90
请按任意键继续. . .

结构体中const使用场景

  • 作用:用const来防止误操作
  • 实例:
#include<iostream>
#include<string>
using namespace std;
struct student {
	//定义学生的结构体
	string name;//学生姓名
	int age;//学生年龄
	int score;//学生分数
};
void printStudents(const student *s) {
	//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
	//值传递:会将实参中的数据拷贝出一份传递给形参,不会出现任何错误
	//s->age = 123;加入const之后,一旦有修改的操作就会进行报错,可以防止误操作
	cout << " 姓名:" << s->name << " 年龄:" << s->age << " 分数:" << s->score << endl;
}
int main() {
	//const使用场景
	//1.创建结构体变量
	struct student s = { "张三",13,78 };
	//2.通过函数打印结构体变量信息
	printStudents(&s);
	//cout << "main中张三的年龄为:" << s.age << endl;
	system("pause");
	return 0;
}
 姓名:张三 年龄:13 分数:78
请按任意键继续. . .

结构体案例1

  • 需求:学校正在做毕设项目,每名老师带领5个学生,总共有三名老师,设计学生和老师的结构体,其中在老师的结构体中,有老师的姓名和一个存放5名学生的数组作为成员,学生的成员有姓名、考试分数、创建数组存放3名老师,通过函数给每个老师以及所带的学生赋值,最终打印出老师数据以及老师所带的学生的数据

  • 在这里插入图片描述

  • 实例:

#include<iostream>
#include<string>
#include<ctime>
using namespace std;
//定义学生的结构体
struct Student {
	//学生的姓名
	string sName;
	//学生的分数
	int score;
};
//定义老师的结构体
struct Teacher {
	//姓名
	string tName;
	//所带学生的数组
	struct Student sArray[5];
};
void allocateSpace(struct Teacher tArray[],int len) {
	string nameSeed = "ABCDE";
	//给老师赋值
	for (int i = 0; i < len;i++) {
		tArray[i].tName = "Teacher_";
		tArray[i].tName += nameSeed[i];
		//通过循环给每名老师所带的学生进行赋值
		for (int j = 0; j < 5; j++) {
			tArray[i].sArray[j].sName = "Student_";
			tArray[i].sArray[j].sName += nameSeed[j];
			int random = rand() % 61 + 40;//40到100之间随机数
			tArray[i].sArray[j].score = random;
		}
	}
}
void printInfo(struct Teacher tArray[],int len) {
	for (int i = 0; i < len; i++) {
		cout << "老师的姓名:" << tArray[i].tName << endl;
		for (int j = 0; j < 5; j++) {
			cout << "\t学生的姓名:" << tArray[i].sArray[j].sName << " 考试分数:" << tArray[i].sArray[j].score << endl;
		}
	}
}
int main() {
	//添加随机数种子
	srand((unsigned int)time(NULL));
	//1.创建三名老师的数组
	struct Teacher tArray[3];
	//2.通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
	int len = sizeof(tArray) / sizeof(tArray[0]);
	allocateSpace(tArray, len);
	//3.打印所有老师以及所带的学生的信息
	printInfo(tArray, len);
	system("pause");
	return 0;
}
老师的姓名:Teacher_A
        学生的姓名:Student_A 考试分数:54
        学生的姓名:Student_B 考试分数:54
        学生的姓名:Student_C 考试分数:59
        学生的姓名:Student_D 考试分数:75
        学生的姓名:Student_E 考试分数:80
老师的姓名:Teacher_B
        学生的姓名:Student_A 考试分数:54
        学生的姓名:Student_B 考试分数:93
        学生的姓名:Student_C 考试分数:55
        学生的姓名:Student_D 考试分数:55
        学生的姓名:Student_E 考试分数:72
老师的姓名:Teacher_C
        学生的姓名:Student_A 考试分数:94
        学生的姓名:Student_B 考试分数:64
        学生的姓名:Student_C 考试分数:95
        学生的姓名:Student_D 考试分数:57
        学生的姓名:Student_E 考试分数:78
请按任意键继续. . .

结构体案例2

  • 需求:设计一个英雄的结构体包括:成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄,通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果
  • 实例:
#include<iostream>
#include<string>
using namespace std;
//1.设计英雄结构体
//创建英雄的结构体
struct Hero {
	//姓名
	string name;
	//年龄
	int age;
	//性别
	string sex;
};
//冒泡排序,实现年龄升序排列
void bubbleSort(struct Hero heroArray[],int len) {
	for (int i = 0; i < len - 1;i++) {
		for (int j = 0; j < len - i - 1;j++) {
			//如果j下标的元素年龄大于j+1下标的元素的年龄,交换两个元素
			if (heroArray[j].age>heroArray[j+1].age) {
				struct Hero temp = heroArray[j];
				heroArray[j] = heroArray[j + 1];
				heroArray[j + 1] = temp;
			}
		}
	}
}
//打印排序后的数组的信息
void printHero(struct Hero heroArray[],int len) {
	for (int i = 0; i < len; i++) {
		cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl;
	}
}
int main() {
	//2.创建数组存放5名英雄
	struct Hero heroArray[5] = {
		{"刘备",23,"男"},
		{"关羽",22,"女"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"}
	};
	int len = sizeof(heroArray) / sizeof(heroArray[0]);
	/*
	for (int i = 0; i < len; i++) {
		cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl;
	}
	*/
	//3.对数组进行排序,按照年龄进行升序排序
	bubbleSort(heroArray, len);
	//4.将排序后的结果进行打印输出
	printHero(heroArray, len);
	system("pause");
	return 0;
}
姓名:貂蝉 年龄:19 性别:女
姓名:张飞 年龄:20 性别:男
姓名:赵云 年龄:21 性别:男
姓名:关羽 年龄:22 性别:女
姓名:刘备 年龄:23 性别:男
请按任意键继续. . .

下节:c++程序的内存模型

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_45671732

你们鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值