【C++ 五】结构体

news2024/12/25 12:23:24

结构体


文章目录

  • 结构体
  • 前言
    • 1 结构体基本概念
    • 2 结构体定义和使用
    • 3 结构体数组
    • 4 结构体指针
    • 5 结构体嵌套结构体
    • 6 结构体做函数参数
    • 7 结构体中 const 使用场景
    • 8 结构体案例
      • 8.1 案例一
      • 8.2 案例二
  • 总结


前言

本文包含结构体基本概念、结构体定义和使用、结构体数组、结构体指针、结构体嵌套结构体、结构体做函数参数、结构体中 const 使用场景。


1 结构体基本概念

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

2 结构体定义和使用

语法: struct 结构体名 { 结构体成员列表 };

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

(1)、struct 结构体名 变量名

(2)、struct 结构体名 变量名 = { 成员1值 , 成员2值…}

(3)、定义结构体时顺便创建变量

#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

// 结构体定义
struct student
{
	// 成员列表
	string name;  // 姓名
	int age;      // 年龄
	int score;    // 分数
}stu3;  // 结构体变量创建方式3:在定义结构体时顺便创建结构体变量

int main() {
 
	// 结构体变量创建方式1:struct student stu1
	struct student stu1;  // struct 关键字可以省略

	stu1.name = "张三";  // 通过.访问结构体变量中的属性
	stu1.age = 18;
	stu1.score = 100;

	cout << "姓名:" << stu1.name << " 年龄:" << stu1.age << " 分数:" << stu1.score << endl;



	// 结构体变量创建方式2:struct student stu2 = {...}
	struct student stu2 = { "李四",19,60 };

	cout << "姓名:" << stu2.name << " 年龄:" << stu2.age << " 分数:" << stu2.score << endl;


	// 结构体变量创建方式3:在定义结构体时顺便创建结构体变量
	stu3.name = "王五";
	stu3.age = 18;
	stu3.score = 80;

	cout << "姓名:" << stu3.name << " 年龄:" << stu3.age << " 分数:" << stu3.score << endl;

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

3 结构体数组

作用: 将自定义的结构体放入到数组中方便维护

语法: struct 结构体名 数组名[元素个数] = { {} , {} , ... {} }

#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

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

int main() {
 
	// 结构体数组
	struct student arr[3] =
	{
		{"张三",18,80 },
		{"李四",19,60 },
		{"王五",20,70 }
	};

	arr[2].name = "赵六";  // 可以修改值
	arr[2].age = 90;
	arr[2].score = 3;

	for (int i = 0; i < 3; i++)
	{
		cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数:" << arr[i].score << endl;
	}

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

4 结构体指针

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

  • 利用操作符 -> 可以通过结构体指针访问结构体属性
#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

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

int main() {
 
	struct student stu = { "张三",18,100, };

	struct student* p = &stu;  // 指针为student类型

	p->score = 80;  // 指针通过 -> 操作符可以访问成员

	cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

5 结构体嵌套结构体

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

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

#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

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

// 教师结构体定义
struct teacher
{
	// 成员列表
	int id;             // 职工编号
	string name;        // 教师姓名
	int age;            // 教师年龄
	struct student stu; // 子结构体 学生
};

int main() {
 
	struct teacher t;
	t.id = 10000;
	t.name = "老王";
	t.age = 40;

	t.stu.name = "张三";
	t.stu.age = 18;
	t.stu.score = 100;

	cout << "教师 职工编号: " << t.id << " \t姓名: " << t.name << " \t年龄: " << t.age << endl;

	cout << "辅导学员 姓名: " << t.stu.name << " \t年龄:" << t.stu.age << " \t考试分数: " << t.stu.score << endl;

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

6 结构体做函数参数

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

传递方式有两种:

(1)、值传递

(2)、地址传递

#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

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

// 值传递
void printStudent(student stu)
{
	stu.age = 28;
	cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;  // 子函数中 姓名:张三 年龄: 28 分数:100
}

// 地址传递
void printStudent2(student* stu)
{
	stu->age = 28;
	cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl; // 子函数中 姓名:张三 年龄: 28 分数:100
}

int main() {
 
	student stu = { "张三",18,100 };

	// 值传递
	printStudent(stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;  // 主函数中 姓名:张三 年龄: 18 分数:100

	cout << endl;

	// 地址传递
	printStudent2(&stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;  // 主函数中 姓名:张三 年龄: 28 分数:100

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

7 结构体中 const 使用场景

作用: 用 const 来防止误操作

#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

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

// const 使用场景
void printStudent(const student* stu)  // 加const防止函数体中的误操作;将函数中的形参该为指针,可以减少内存空间,而且不会复制新的副本出来
{
	//stu->age = 100;  // 操作失败,因为加了const修饰
	cout << "姓名:" << stu->name << " \t年龄:" << stu->age << " \t分数:" << stu->score << endl;
}

int main() {
 
	student stu = { "张三",18,100 };

	printStudent(&stu);

	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

8 结构体案例

8.1 案例一

案例描述:

学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下:

(1)、设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员

(2)、学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值

(3)、最终打印出老师数据以及老师所带的学生数据

在这里插入图片描述

#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

// 学生结构体定义
struct Student
{
	string name;  // 姓名
	int score;    // 分数
};

// 教师结构体定义
struct Teacher
{
	string name;        // 姓名
	Student sArray[5];  // 学生数组
};

// 创建数组函数
void allocateSpace(Teacher tArray[], int len)  // Teacher tArray[],比较直观,代表传的是数组 ; len 数组长度
{
	string tName = "教师";
	string sName = "学生";
	string nameSeed = "ABCDE";
	for (int i = 0; i < len; i++)
	{
		tArray[i].name = tName + nameSeed[i];  // 给教师姓名赋值

		for (int j = 0; j < 5; j++)
		{
			tArray[i].sArray[j].name = sName + nameSeed[j];  // 给教师的学生姓名赋值
			tArray[i].sArray[j].score = rand() % 61 + 40;    // 40 ~ 100 ; 给教师的学生分数赋值
		}
	}
}


// 打印数组函数
void printTeachers(Teacher tArray[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << tArray[i].name << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t姓名:" << tArray[i].sArray[j].name << " 分数:" << tArray[i].sArray[j].score << endl;
		}
	}
}

int main() {
 
	srand((unsigned int)time(NULL));  // 随机数种子 头文件 #include <ctime>

	Teacher tArray[3];  // 老师数组

	int len = sizeof(tArray) / sizeof(Teacher);  // 计算数组长度

	allocateSpace(tArray, len);  // 创建数据

	printTeachers(tArray, len);  // 打印数据


	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述

8.2 案例二

案例描述:

(1)、设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄

(2)、通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果

(3)、五名英雄信息如下:

		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},
#include <iostream>  // 包含标准输入输出流文件
using namespace std;  // 使用标准命名空间

// 英雄结构体
struct hero
{
	string name;  // 姓名
	int age;      // 年龄
	string sex;   // 性别
};

// 冒泡排序
void bubbleSort(hero arr[], int len)
{
	for (int i = 0; i < len - 1; i++)  // 总共排序轮数:元素个数 - 1
	{
		for (int j = 0; j < len - 1 - i; j++)  // 对比次数:元素个数 - 当前轮数 - 1
		{
			if (arr[j].age > arr[j + 1].age)  // 按年龄进行排序;交换
			{
				hero temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

// 打印数组
void printHeros(hero arr[], int len)  // hero arr[],比较直观,代表传的是数组;len数组长度
{
	for (int i = 0; i < len; i++)
	{
		cout << "姓名: " << arr[i].name << " \t性别: " << arr[i].sex << " \t年龄: " << arr[i].age << endl;
	}
}

int main() {
 
	// 结构体赋值
	struct hero arr[5] =
	{
		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},
	};

	int len = sizeof(arr) / sizeof(hero);  // 获取数组元素个数

	bubbleSort(arr, len);  // 排序

	printHeros(arr, len);  // 打印


	system("pause");  // 相当于在本地 Windows 调试器中的:请按任意键继续...;暂停,方便看清楚输出结果

	return 0;  // 程序正常退出
}

在这里插入图片描述


总结

(1)、定义结构体时的关键字是 struct,不可省略;

(2)、创建结构体变量时,关键字 struct 可以省略;

(3)、结构体变量利用操作符 ‘’.‘’ 访问成员;

(4)、结构体指针可以通过 -> 操作符 来访问结构体中的成员;

(5)、在结构体中可以定义另一个结构体作为成员,用来解决实际问题;

(6)、如果不想修改主函数中的数据,用值传递,反之用地址传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitlab CI CD基础概念

gitlab CI CD基础概念 本文目录 gitlab CI CD基础概念基础概念Pipelines&#xff1a;流水线JobsStage .gitlab-ci.yml使用模式1&#xff1a;官网gitlab 本地gitlab runner使用模式2&#xff1a;docker gitlab docker gitlab runner 基础概念 开发模式转变&#xff1a;瀑布模…

【MySQL】(5)聚合函数

文章目录 聚合函数COUNT 函数SUM 函数AVG 函数MAX 函数 MIN 函数 group by 子句简介示例&#xff1a;scott 数据库单列分组多列分组 having 子句总结 聚合函数 在 MySQL 中&#xff0c;聚合函数是用于计算多行数据的统计信息的函数&#xff0c;例如总和、平均值、最大值、最小…

图扑数字孪生工厂合集 | 智慧工厂可视化,推动行业数字化转型

前言 图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#…

LeetCode算法小抄--花式遍历二叉树

LeetCode算法小抄--花式遍历二叉树花式遍历二叉树翻转二叉树[226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)填充节点的右侧指针[116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)将…

OpenCV实例(一)人脸检测

OpenCV实例&#xff08;一&#xff09;人脸检测 1.人脸检测和识别概述2.使用OpenCV进行人脸检测2.1静态图像中的人脸检测2.2视频中的人脸检测 作者&#xff1a;Xiou 1.人脸检测和识别概述 计算机视觉使很多任务成为现实&#xff0c;其中两项任务就是人脸检测&#xff08;在图…

psql Centos7安装postgresql-12

之前在centos7上下的postgresql&#xff0c;它的数据库实例在 “var/lib/pgsql/” 下。这就导致了系统用户的"postgres"的家目录跟postgresql数据库目录不在同一目录下。因此&#xff0c;今天趁着有闲暇时间把数据库装到"postgres"目录下&#xff0c;顺便把…

罗丹明荧光染料标记叶酸,FA-PEG2000-RB,叶酸-聚乙二醇-罗丹明; Folic acid-PEG-RB

FA-PEG-RB,叶酸-聚乙二醇-罗丹明 中文名称&#xff1a;叶酸-聚乙二醇-罗丹明 英文名称&#xff1a;FA-PEG-RB, Folic acid-PEG-RB 性状&#xff1a;粉红色固体或液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DMSO、DMF等常规性有机溶剂 保存条件&#xff1a;-2…

学习系统编程No.17【vscode实战】

引言&#xff1a; 北京时间&#xff1a;2023/4/11/7:25&#xff0c;昨天11点洗澡&#xff0c;洗完直接睡&#xff0c;导致现在头发愈发不能看&#xff0c;So&#xff0c;平头时刻将要来临&#xff0c;头发太长真的很不方便&#xff0c;昨天已经更文啦&#xff01;这个星期一定…

miss_01(简单密码学及音频隐写)

下载附件&#xff0c;解压时提示输入密码 使用010editor打开&#xff0c;发现deFlags值被修改 &#xff08;如果frFlags 或者 deFlags 的值不为0就会导致zip的伪加密&#xff09; 将deFlags的值修改为0&#xff0c;并将文件另存为1.zip 再次打开&#xff0c;没有密码提示了 打…

酒吧攻略:一文解读酒吧类型

目前主流酒吧类型可以大致分为以下几类&#xff1a; 夜店&#xff1a;&#xff08;NIGHT CLUB&#xff09;&#xff1a;KTV&#xff0c;夜总会&#xff0c;酒吧等总称club&#xff0c;主要指的就是夜店。 Bar&#xff1a;多指娱乐休闲类的酒吧&#xff0c;提供现场的乐队或歌…

UG导出点集坐标到txt文本文档中

文章目录 前言一、下载文件二、使用步骤1.运行Grip程序2.选择下载的points-file.grx文件3.选择要导出的文本文档的位置4.选择想要导出的点集5.查看文件 参考 前言 将UG中的离散的点或者点集坐标导出到文本文档&#xff1b; 原文地址 俩文件链接如下&#xff0c;失效了可以私信…

客快物流大数据项目(一百一十四):负载均衡 Spring Cloud Ribbon

文章目录 负载均衡 Spring Cloud Ribbon 一、Ribbon 简介 二、负载均衡源码跟踪探究 负载均衡 Spring Cloud Ribbon 为了增加服务并发访问量,我们搭建集群,集群的负载均衡怎么实现?

OpenAI-ChatGPT最新官方接口《速率并发限制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(八)(附源码)

Rate limits 速率并发限制前言Introduction 导言What are rate limits? 什么是速率限制&#xff1f;Why do we have rate limits? 为什么我们有速率限制&#xff1f;What are the rate limits for our API? 我们API的速率限制是什么&#xff1f;GPT-4 rate limits GPT-4速率…

【JavaEE】Spring + IoC + DI

目录 Spring概念 IoC DI Spring概念 Spring是包含众多工具方法的IoC容器。 IoC IoC&#xff1a;Inversion of Control 控制权反转 它是一种思想&#xff0c;是面向对象的一种设计原则。这种思想为了实现类与类之间的解耦。 比如当一个对象要使用另一个对象时&#xff0c;不再…

IO流相关知识

IO流 1.文件 保存数据的地方 2.文件流 文件在程序中以流的形式来操作的 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间的经历的路程 输入流&#xff1a;数据从数据源&#xff08;文件&#xff09;到程序&#xff08;内存…

【FPGA-DSP】第五期:FFT调用流程

目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理 拓&#xff1a;输入信号位数改变 本章节主要说明如何在system generator中使用fft模块&#xff0c;话不多说&#xff0c;看操作&#xff1a; 参考教程第5期 - FFT调用流…

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言&#xff1a; 本文主要介绍了如何使用Python VTK高亮显示actor&#xff0c;使用Python语言&#xff0c;高亮显示选中的actor。当窗口中的圆球actor被选中时&#xff0c;会变成红色&#xff0c;并且会显示actor三遍面片边缘信息。 效果&#xff1a; VTK VTK&#xff0c;&…

Linux常见实用操作汇总(带示例版)

Linux常见实用操作汇总 1、各类快捷键1.1 强制停止1.2 退出、登出1.3 历史命令搜索1.4 光标移动1.5 清屏 2、软件安装2.1 在CentOS系统中&#xff0c;使用yum命令联网管理软件安装2.2 在Ubuntu系统中&#xff0c;使用apt命令联网管理软件安装。 3、systemctl4、软连接5、日期和…

Golang每日一练(leetDay0036) 二叉树专题(5)

目录 106. 从中序与后序遍历序列构造二叉树 Construct-binary-tree-from-inorder-and-postorder-traversal &#x1f31f;&#x1f31f; 107. 二叉树的层序遍历 II Binary Tree Level-order Traversal II &#x1f31f;&#x1f31f; 108. 将有序数组转换为二叉搜索树 C…

Nginx配置ssl证书实现https安全访问

目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件&#xff0c;拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx&#xff0c;则需查看自己的Nginx是否开启了SSL的模块功能&#xff1a; ./nginx -V 显…