从零起步学C++笔记(四)-结构体

本文详细介绍了C++中结构体的基础概念,包括定义、使用、数组、指针、嵌套结构体以及结构体作为函数参数和const的使用。通过实例演示了如何创建、赋值和操作结构体,以及在处理老师和学生信息时的应用。
摘要由CSDN通过智能技术生成

1 结构体

1.1 结构体的概念

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

1.2 结构体的定义和使用

语法如下:

struct 结构体名 {

结构体成员列表

};//这里有分号

创建具体的变量有三种方法

struct 结构体名 变量名;

struct 结构体名 变量名={值1,值2,···};

struct 结构体名 {

结构体成员列表

}变量名;

创建一个学生数据类型,并创建具体的学生

#include<iostream>
#include<string>
using namespace std;

//定义一个结构体
// struct 类型名 { 成员列表 }
struct student {//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
}s3;//定义结构体时就创建

int main() {
	
	//创建具体的学生

	//struct 结构体名 变量名;
	//直接定义
	struct student s1;
	//给其属性赋值 用.访问
	s1.name = "张三";
	s1.age = 17;
	s1.score = 98;
	cout << s1.name << "年龄" << s1.age << "成绩" << s1.score << endl;

	//创建时就赋值
	struct student s2 = { "李四",16,93 };
	cout << s2.name << "年龄" << s2.age << "成绩" << s2.score << endl;

	//给创结构体时创建的s3赋值
	s3.name = "王五";
	s3.age = 17;
	s3.score = 88;
	cout << s3.name << "年龄" << s3.age << "成绩" << s3.score << endl;

	return 0;
}

创建结构体时可以省略struct

student s1;
	//给其属性赋值 用.访问
s1.name = "张三";
s1.age = 17;
s1.score = 98;

1.3 结构体数组

创建语法如下

struct 结构体名 数组名 [ 元素个数 ] = { {},{},··· }

#include<iostream>
#include<string>
using namespace std;

//定义一个结构体
// struct 类型名 { 成员列表 }
struct student {//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

int main() {
	
	//创建学生数组
	student stu_arr[4] = {
		{"张三",17,98},
		{"李四",16,93},
		{"王五",17,88},
		{"赵六",16,84}
	};

	for (int i = 0; i < sizeof(stu_arr)/sizeof(stu_arr[0]); i++)
	{
		cout << stu_arr[i].name << "年龄" << stu_arr[i].age << "成绩" << stu_arr[i].score << endl;
	}
	return 0;
}

1.4 结构体指针

作用:通过指针访问结构体成员

  • 利用操作符 -> 可以通过结构体指针访问结构体属性
#include<iostream>
#include<string>
using namespace std;

//定义一个结构体
// struct 类型名 { 成员列表 }
struct student {//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

int main() {
	
	//创建学生
	student s = { "张三",17,98 };
	
	//通过指针指向结构体变量
	student* p = &s;

	//通过指针访问结构体变量中的数据
	cout << p->name << "年龄" << p->age << "分数" << p->score << endl;
	
	//解引用方法访问
	cout << (*p).name << "年龄" << (*p).age << "分数" << (*p).score << endl;

	return 0;
}

1.5 结构体嵌套结构体

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

创建一个含有四个学生的班级

#include<iostream>
#include<string>
using namespace std;
struct student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//定义一个班级结构体,包含四个学生
struct _class {
	int id;//班级编好
	int grade;//年级
	int num;//学生数量
	student s1;
	student s2;
	student s3;
	student s4;
};

int main() {
	
	//创建班级
	_class class1;

	//赋值
	class1.id = 306;
	class1.grade = 3;
	class1.s1 = { "张三",17,98 };
	class1.s2 = { "李四",16,93 };
	class1.s3 = { "王五",17,88 };

	//可以通过.访问子结构体的属性
	class1.s4.name = "赵六";
	class1.s4.age = 16;
	class1.s4.score = 84;

	return 0;
}

1.6 结构体做函数参数

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

  • 值传递
  • 地址传递
#include<iostream>
#include<string>
using namespace std;
struct student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//值传递
void print_stu(student s) {
	cout << s.name << "的年龄是" << s.age << ",分数是" << s.score << endl;
}

//地址传递
void change_age(student* s, int age) {
	s->age = age;
}

int main() {
	
	//创建学生
	student s1 = { "张三",17,98 };
	//传入一个函数中打印信息
	print_stu(s1);

	//修改学生的年龄
	int new_age;
	cout << "请输入新的年龄:" << endl;
	cin >> new_age;

	//传入地址
	change_age(&s1, new_age);
	print_stu(s1);
	return 0;
}

1.7 结构体中const的使用场景

作用:用const防止误操作

#include<iostream>
#include<string>
using namespace std;
struct student {
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
};

//将函数中的形参改为指针,可以减少内存消耗,提升效率
//但是会有原来的数据被修改的风险
//加入const防止误操作
void print_stu(const student* s) {
	//s->age = 78;这个操作会报错
	cout << s->name << "的年龄是" << s->age << ",分数是" << s->score << endl;
}

int main() {
	
	//创建学生
	student s1 = { "张三",17,98 };
	//传入一个函数中打印信息
	print_stu(&s1);

	return 0;
}

例题

  • 三个老师,每个人有五个学生
  • 设计老师的结构体,有老师姓名和五个学生的学生数组
  • 设计学生结构体,有姓名,分数
  • 创建老师数组,打印所有信息
#include<iostream>
#include<string>
using namespace std;

struct student {
	string name;
	int score;
};

struct teacher {
	string name;
	student stu_arr[5];
};

void print_tchr_arr(teacher arr[], int length) {
	for (int i = 0; i < length; i++)
	{
		cout << "老师的姓名是:" << arr[i].name << endl;
		cout << "学生信息:" << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t学生姓名:" << arr[i].stu_arr[j].name << "\t分数:" << arr[i].stu_arr[j].score << endl;
		}
	}

}

void allocate(teacher arr[], int length) {
	//给老师名字赋值
	string nameseed = "ABCDE";
	for (int i = 0; i < length; i++)
	{	
		//输入老师的名字
		cout << "输入第" << i+1 << "个老师的名字:";
		cin >> arr[i].name;
		//给每个学生赋值
		for (int j = 0; j < 5; j++)
		{
			cout << "输入第" << i+1 << "个老师的第" << j+1 << "个学生的名字:";
			cin >> arr[i].stu_arr[j].name;
			cout << "输入第" << i+1 << "个老师的第" << j+1 << "个学生的成绩:";
			cin >> arr[i].stu_arr[j].score;
		}
	}
}

int main() {
	
	teacher tchr_arr[3];
	int length = sizeof(tchr_arr) / sizeof(tchr_arr[0]);
	allocate(tchr_arr, length);
	print_tchr_arr(tchr_arr, length);
	return 0;
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值