Visual Studio2017C++学习笔记(八)-结构体

Visual Studio2017C++学习笔记(八)-结构体,第1张

前言

软件为visual studio2017,内容为C++学习笔记,以及相关的问题处理方法,目的是方便回顾和复习。
笔记来自于:黑马程序员C++教程。


一、结构体的基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
二、结构体的定义和使用 1.语法
语法:struct 结构体名 {结构体成员列表};

通过结构体创建变量的方式有三种:

 - struct 结构体名 变量名
 - struct 结构体名 变量名 = {成员1值,成员2....}
 - 定义结构体顺便创建变量
	
2.关键点
1、结构体定义,结构体属于用于自定义的数据类型,允许用户定义不同的数据类型
2、将许多数据类型放在一起,作为一个新的数据类型,即自定义数据类型。
3、自定义的数据类型,一些类型集合组成一个类型
3.代码(示例):
struct Student {

	//成员列表
	string name; //姓名
	int age;     //年龄
	int score;   //分数
}s3;//定义结构体时,顺便创建结构体变量

//2、通过学生数据类型创建具体学生
int main() {
	//2.1定义方式 struct Student s1
	struct Student s1;	//创建一个结构体变量,相当于数据类型 + 变量名
	
	s1.name = "张三";	//给结构体变量s1进行赋值,通过.访问结构体变量中的属性
	s1.age = 24;
	s1.score = 86;
	cout << "姓名: " << s1.name << "年龄:" << s1.age << "分数为: " << s1.score << endl;;
	
	//2.2结构体变量名 struct Student s2={}
	struct Student s2 = {"李四", 28, 100 }; //Student s2={"李四",28,100}
	//创建结构体变量时,struct变量可以省略
	cout << "姓名: " << s2.name << "年龄:" << s2.age << "分数为: " << s2.score << endl;;

	
	//2.3定义结构体时顺便创建结构体变量
	s3.name = "王五";
	s3.age = 26;
	s3.score = 89;
	cout << "姓名: " << s3.name << "年龄:" << s3.age << "分数为: " << s3.score << endl;;
	
4.小结 (1)定义结构体时候的关键字struct,不可省略。 (2)创建结构体变量时,关键字struct可以省略。 (3)结构体变量可以通过“.”访问成员。 三、结构体数组 1.作用
  • 作用:将自定义的结构体放入到数组中方便维护
2.语法
struct 结构体名 数组名[元素个数] = {{ }{ }{ }}
结构体数组中,装的都是结构体变量,每个结构体变量中装入的都是多类型的元素。
3.示例
//1、定义结构体

struct Student {
	//成员列表
	string name;//姓名
	int age;//年龄
	int score;//分数

};

int main() {
	//2、创建结构体数组
	struct Student stuArray[3] = {
	//将结构体变量当做一个元素放到数组中,struct Student视为数据类型
		{"张三",26,86},//都是struct Student类型的结构体
		{"李四",28,89},
		{"王五",31,91}
	};
	//3、给结构体数组中的元素赋值
	stuArray[1].name = "赵丽颖";//根据数组中的结构体进行数组的访问。

	//4、遍历结构体数组
	for (int i = 0; i < 3; i++) {
		cout << "姓名: " << stuArray[i].name << "年龄: " << stuArray[i].age << "分数: " << stuArray[i].score<<endl;;
	}
	
四、结构体指针 1.作用
通过指针访问结构体中的成员。
  • 利用 *** 作符->可以通过结构体指针访问结构体的属性。
2.代码示例
//1.构建结构体
struct Student {
	string name;//姓名
	int age;//年龄
	int score;//分数
};
int main() {
	//1.创建学生结构体变量
	struct Student s1 = { "李四",24,96 }; //将struct Student作为数据类型
	
	//2.通过指针指向结构体变量
	//指针的数据类型为struct Student,由于指定好内存后,系统才能分配好空间。
	//通过结构体指针 访问结构体中的属性,需要利用'->'
	struct Student *p = &s1;//指针的值为变量的地址。
	
	//3.通过指针访问结构体变量中的数据
	cout << "姓名: " << p->name << " 年龄: " << p->age << " 分数:" << p->score << endl;
	

五、结构体嵌套结构体 1.作用
结构体中的成员可以是另一个结构体

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

2.示例
//结构体定义
//学生的结构体
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 = 50;
	t.stu.age = 20;
	t.stu.name = "小李";
	t.stu.score = 89;
	cout << "老师的id:" << t.id << " 老师的名字为: " << t.name << " 老师的年龄为: " << t.age
		<< " 老师带的学生的姓名:" << t.stu.name << " 老师带的学生的年龄:" << t.stu.age << " 老师带的学生的分数为:" << t.stu.score << endl;
	system("pause");
	return 0;
}
3.小结

在一个结构体中定义另一个结构体,已解决实际问题。

六、结构体做函数参数 1.作用
  • 作用:将结构体作为参数向函数中传递。
2.传递方式

(1)值传递
(2)地址传递

3.示例
//定义一个学生的结构体
struct Student {
	string name;
	int age;
	int score;
};
//打印学生信息函数
//1、值传递函数
void printStu1(struct Student s) {//关键点,理解struct Student视为一种数据类型。
	s.age = 200;//函数内部进行值传递时,改变形参不改变实参的值
	cout << "结构体函数1中的姓名:" << s.name << " 年龄: " << s.age << " 分数: " << s.score << endl;
}

//2、地址传递
//定义结构体类型的指针
void printStu2(struct Student *p) {//指针类型为struct Student
	p->age = 200;//地址传递的时候,改变形参,即改变实参的值。
	cout << "结构体函数2中的姓名:" << p->name << " 年龄: " << p->age << " 分数: " << p->score << endl;

}
int main() {
	//将结构体做函数参数
	//将学生传入到一个参数中,打印学生身上的所有信息。

	struct Student s1;
	s1.name = "张三";
	s1.age = 49;
	s1.score = 98;
	
	cout << "进行值传递" << endl;
	printStu1(s1);//打印学生信息。
	cout << "main()函数中的学生姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl;

	cout << "进行地址传递" << endl;
	printStu2(&s1);
	cout << "main()函数中的学生姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl;

	system("pause");
	return 0;

4.总结
  • 总结:如果不想修改主函数中的数据,用值传递,反之用地址传递。

七、结构体中的const使用场景 1.值传递的问题
  • 1、值传递,值传递的时候,不改变实参的值,但是会新开辟内存空间存储实参的值,复制数据,进行值的传递。
  • 2、值传递的缺点:实参量越多,需要赋值的数据越多,需要额外的空间越大,浪费或者消耗大量的内存空间。
2.地址传递的优点
  • 1、地址传递就可以进行,直接 *** 作数据,不会占用额外的内存空间。
  • 2、将函数中的形参改为指针,就可以减少内存空间,而且不会复制新的副本出来。
  • 3、地址传递就可以进行,直接 *** 作数据,不会占用额外的内存空间。
  • 4、使用指针可以节省空间
3.示例(代码)
void printStu(const struct Student *s) {
	//s->age = 200;//加入const后,一旦有修改的 *** 作就会报错,可以防止我们误 *** 作.
	cout << "学生的信息为:" << s->name << " 年龄: " << s->age << " 分数: " << s->score << endl;
}
int main() {

	//创建结构体变量
	struct Student s = { "张三",15,70 };
	printStu(&s);
	cout << "main()函数中的学生姓名: " << s.name << " 年龄: " << s.age << " 分数: " << s.score << endl;
	//通过函数打印结构体信息
	system("pause");
	return 0;
	}
八、结构体案例(1) 1.案例1

案例描述:

学习正在做毕设项目,每名学生带领5个学生,总共有3名老师,需求如下:
  • 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学身的数组作为成员。
  • 学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值,最终打印出老师数据以及老师所带的学生数据。
2.代码(示例)
//学习正在做毕设项目,每名学生带领5个学生,总共有3名老师,需求如下:
//- 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学身的数组作为成员。
//- 学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值,最终打印出老师数据以及老师所带的学生数据。
struct Student {
	string sName;
	int score;
};

struct teacher {
	string tName;
	struct Student sArray[5];//结构体数组
};

void allocateSpace(struct teacher tArray[],int len){
	string tnameArray = "ABC";//char tnameArray1[] = "ABC";字符串的定义方式
	string snameArray = "abcde";
	//为老师和学生结构体赋初值
	for (int i = 0; i < len; i++) {
		tArray[i].tName = "teacher_";
		tArray[i].tName += tnameArray[i];
		for (int j = 0; j < 5; j++) {
			tArray[i].sArray[j].sName = "student_";
			tArray[i].sArray[j].sName += snameArray[j];
			int random = rand() % 60 + 40;//分数random的范围为:40-99
			tArray[i].sArray[j].score = random;
		}
	}
}
void printST(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、创建数组存放3名老师数组
	struct teacher tArray[3];
	
	//2、通过函数给3名老师的信息赋值,并给老师带的学生信息赋值。
	int len = sizeof(tArray) / sizeof(tArray[0]);
	allocateSpace(tArray,len);
	
	//3、打印所有老师及所带的学生信息

	printST(tArray, len);

	system("pause");
	return 0;

九、结构体案例(2) 1.案例描述
  • 设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。通过冒泡排序的算法,将数组中的年龄进行排序,最终打印排序后的结果。
  • 五名英雄信息如下:
	{“刘备”,23,“男”}{“关羽”,22,“男”}{“张飞”,20,“男”}{“赵云”,21,“男”}{“貂蝉”,19,“女”}
2.代码示例
struct Heros {
	//成员列表
	string name;	//姓名
	int age;		//年龄
	string gender;	//性别
};
//冒泡法进行结构体数组排序
void bubblesort(struct Heros hero[],int len ) {//对结构体数组元素按着年龄进行排序。
	for (int i = 0; i < len; i++) {
		for (int j = 0; j < len - i - 1; j++) {
			if (hero[j].age > hero[j + 1].age) {//数组元素前者大于后者进行元素交换
				struct Heros temp = hero[j];//定义一个结构体变量进行元素交换。
				hero[j] = hero[j + 1];
				hero[j + 1] = temp;
			}
		}
	}
}
//打印英雄
void print_heros(struct Heros hero[], int len) {
	for (int i = 0; i < len; i++) {
		cout << "英雄的名字:" << hero[i].name << " 年龄:" << hero[i].age << " 性别: " <<hero[i].gender << endl;
	}
}
int main() {
	struct Heros hero_list[5] = {
	{"刘备",23,"男"},
	{"关羽",22,"男"},
	{"张飞",20,"男"},
	{"赵云",21,"男"},
	{"貂蝉",19,"女"}
	};
	int len = sizeof(hero_list) / sizeof(hero_list[0]);
	cout << "数组分长度为:" << len << endl;
	//数组排序
	bubblesort(hero_list, len);
	//数组打印输出
	print_heros(hero_list, len);
	system("pause");
	return 0;
	}


总结

主要对结构体的定义和使用等进行了介绍,并给出了具体案例对结构体的使用。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/915292.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存