【C++】C++基础知识(八)---结构体

news2025/8/11 21:04:52

C++基础知识(八)

  • 1. 定义与使用
  • 2. 结构体数组
  • 3. 结构体指针
  • 4. 结构体嵌套
  • 5. 结构体作函数参数
  • 6. 结构体中const使用场景
  • 7. 结构体使用案例

1. 定义与使用

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

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

结构体创建变量的方式有三种:
------1、struct 结构体名 变量名
------2、struct 结构体名 变量名 = {结构体成员列表}
------3、struct 结构体名 {结构体成员列表} 变量名(定义结构体时创建变量)

注意:
结构体变量在构造完成后需要进行初始化,不然会弹出警告
创建结构体变量的时候struct关键字可以省略

  • 代码演示
#include <iostream>
using namespace std;
#include <string>

int main() {

	// 1、结构体 结构体名 变量名;
	struct student
	{
		string name{}; //姓名
		int age{}; //年龄
		int score{}; //分数
	};
	struct student s1;
	s1.name = "小张";
	s1.age = 18;
	s1.score = 680;
	cout << "姓名:" << s1.name << endl << "年龄:" << s1.age << endl << "分数:" << s1.score << endl;

	// 2、结构体 结构体名 变量名 = {结构体成员列表};
	struct student s2 = { "小刘",18,666 };
	cout << "姓名:" << s2.name << endl << "年龄:" << s2.age << endl << "分数:" << s2.score << endl;

	// 3、定义结构体时顺便创建变量;
	struct teacher
	{
		string name{}; //姓名
		int age{}; //年龄
		int score{}; //分数
	}t1;
	t1.name = "何";
	t1.age = 30;
	t1.score = 10;
	cout << "姓名:" << t1.name << endl << "年龄:" << t1.age << endl << "分数:" << t1.score << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

2. 结构体数组

将定义的结构体放入到数组中方便维护
结构体数组语法:
------struct 结构体名 数组名[数组长度] = {{},{},…,{}}

  • 代码演示
#include <iostream>
using namespace std;
#include <string>

int main() {

	// 1、定义结构体
	struct student
	{
		string name;
		int age;
		int score;
	};
	// 2、创建结构体数组
	struct student arr[3] = 
	{
		{"小张",18,99},
		{"小李",20,88},
		{"小王",24,100}
	};
	// 3、访问结构体数组中的元素属性
	arr[0].age = 33;
	// 4、打印结构体数组中的元素属性
	for (int i = 0; i < 3; i++)
	{
		cout << arr[i].name << " " << arr[i].age << " " << arr[i].score << endl;
	}

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

3. 结构体指针

通过指针可以访问结构体中的成员
结构体指针可以通过操作符->访问结构体中的属性

  • 代码演示
#include <iostream>
using namespace std;
#include <string>

// 1、定义结构体
struct student
{
	string name;
	int age;
	int score;
};

int main() {

	// 2、创建结构体变量
	struct student stu ={"小张",18,99};

	// 3、创建结构体指针
	struct student *p = &stu;

	// 4、利用结构体指针访问结构体中的属性
	p->name = "老张";
	cout << "姓名: " << p->name << "年龄: " << p->age << "分数: " << p->score << endl;

	system("pause");
	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() {

	//创建老师结构体变量
	struct teacher teach;
	teach.id = 10000;
	teach.name = "老王";
	teach.age = 30;
	teach.stu.name = "小王";
	teach.stu.age = 18;
	teach.stu.score = 100;
	cout << "老师id: " << teach.id << "姓名: " << teach.name << "年龄: " << teach.age << endl;
	cout << "学生姓名:" << teach.stu.name << "年龄: " << teach.stu.age << "分数: " << teach.stu.score << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

5. 结构体作函数参数

结构体可以作为函数的参数,来实现数据的传递
传递方式有两种:
------1、值传递
------2、地址传递
注意:
------若不想修改主函数中的数据,则用值传递,反之使用地址传递

  • 代码演示
#include <iostream>
using namespace std;
#include <string>

// 定义结构体
struct student
{
	string name;
	int age;
	int score;
};

// 1、值传递函数
void printStudent1(struct student stu)
{
	stu.age = 100;
	cout << "姓名:" << stu.name << " 年龄:" << stu.age << " 分数:" << stu.score << endl;
}

// 2、地址传递函数
void printStudent2(struct student * stu)
{
	stu->age = 200;
	cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl;
}

int main() {

	// 创建结构体变量
	struct student stu = {"小张",18,100};
	
	// 1、值传递
	printStudent1(stu);
	cout << "姓名:" << stu.name << " 年龄:" << stu.age << " 分数:" << stu.score << endl;

	// 2、地址传递
	printStudent2(&stu);
	cout << "姓名:" << stu.name << " 年龄:" << stu.age << " 分数:" << stu.score << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

6. 结构体中const使用场景

在定义函数的时候,函数参数的传递方式为值传递时会占用更多的内存,而地址传递只会占用4-8个字节,因此,在数据量较大的情况下通常会采用地址传递的方式但是地址传递会带来的一个问题就是会修饰实参从而改变主函数中的数据。针对这个问题,可以用const这个关键字来解决,为了防止地址传递修饰实参,在指针前面加上一个const关键字(得到常量指针,只能修改指针的指向,但是不能修改指针指向内存的值)就可以了。

  • 代码演示
#include <iostream>
using namespace std;
#include <string>

// 定义结构体
struct student
{
	string name;
	int age;
	int score;
};

// 定义一个打印函数
// 为了防止地址传递会修饰实参,在指针前面加上一个const关键字
void printstudent(const struct student *stu)
{
	// stu->age = 99; //常量指针只能改变指针的指向,但是不能改变指针指向内存的值
	cout << " 姓名: " << stu->name << " 年龄: " << stu->age << " 分数: " << stu->score << endl;
}

int main() {

	// 创建结构体变量
	struct student stu = {"老朱", 20, 100};

	// 调用一个函数来打印结构体中所包含的数据
	// 值传递方式会占用更多的内存,而地址传递就占用4或8个字节,因此,在数据量较大的情况下会选择用地址传递
	printstudent(&stu);

	// 打印一下年龄
	cout << " 年龄: " << stu.age << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

7. 结构体使用案例

1. 案例一

  • 案例描述

做毕业设计时,每名老师可以带5位学生,总共有三名老师,要求如下:老师的结构体中包含老师的姓名以及5名学生的结构体数组; 学生结构体中有学生的姓名,分数; 创建一个数组存放三名老师;通过函数给每名老师和学生的成员属性进行赋值;最终打印出老师所带的数据,以及老师所带学生的所有数据。

  • 思路分析

1、创建老师、学生结构体数组;
2、定义给老师、学生结构体成员赋值的赋值函数allocateSpace(struct teacher teach_arr[], int len);
3、定义老师、学生结构体成员值的打印函数printInfo(struct teacher teach_arr[], int len);
4、依次调用赋值函数、打印函数实现案例所要求的功能;

  • 代码实现
#include <iostream>
using namespace std;
#include <string>
#include <Ctime>

// 定义学生结构体
struct student
{
	string s_name{}; //姓名
	int s_score{}; //分数
};

// 定义教师结构体
struct teacher
{
	string t_name{}; //姓名
	struct student stu_arr[5]; //创建学生结构体数组
};

// 创建赋值函数
void allocateSpace(struct teacher teach_arr[], int len)
{
	string name_number = "ABCDE";
	for (int i = 0; i < len; i++)
	{
		// 给老师中的老师姓名属性赋值
		teach_arr[i].t_name = "teacher_";
		teach_arr[i].t_name += name_number[i]; //字符串的拼接

		// 给老师中的学生的属性进行赋值
		for (int j = 0; j < 5; j++)
		{
			// 给学生中的姓名属性赋值
			teach_arr[i].stu_arr[j].s_name = "student_";
			teach_arr[i].stu_arr[j].s_name += name_number[j];

			// 给学生中的分数属性赋值
			// 设定一个随机数来给学生的分数赋值
			int random = rand() % 61 + 40; // 40~100之间的一个随机数
			teach_arr[i].stu_arr[j].s_score = random;
		}
	}
}

//创建打印函数
void printInfo(struct teacher teach_arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		// 打印老师的属性
		cout << "老师的姓名:" << teach_arr[i].t_name << endl;

		// 打印学生的属性
		for (int j = 0; j < 5; j++)
		{
			cout << "\t学生的姓名:" << teach_arr[i].stu_arr[j].s_name << "\t学生的分数:" << teach_arr[i].stu_arr[j].s_score << endl;
		}
	}
}

int main() {

	// 创建一个随机数种子
	srand((unsigned int)time(NULL));
	
	// 1、创建3名老师的结构体数组
	struct teacher teach_arr[3];
	int len = sizeof(teach_arr) / sizeof(teach_arr[0]); //教师数组长度

	// 2、调用赋值函数给老师和学生赋值
	allocateSpace(teach_arr , len);

	// 3、调用打印函数打印结构体中的数据
	printInfo(teach_arr, len);

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

2. 案例二

  • 案例描述

设计一个英雄的结构体,包括成员的姓名,年龄,性别;
创建结构体数组,数组中存放5名英雄;通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排列,最终打印排序后的结果。 五名英雄的属性如下:
{“刘备”, 23, “男”},
{“关羽”, 22, “男”},
{“张飞”, 20, “男”},
{“赵云”, 21, “男”},
{“貂蝉”, 19, “女”}

  • 思路分析

1、定义一个英雄结构体,创建一个存放5名英雄信息的结构体数组;
2、定义一个冒泡排序函数bubbleSort(struct hero h_arr[], int len);
3、定义英雄结构体中属性的打印函数printStruct(struct hero h_arr[], int len);
4、依次调用冒泡排序函数、打印函数实现案例所要求的功能;

  • 代码实现
#include <iostream>
using namespace std;
#include <string>

// 定义英雄结构体
struct hero
{
	string name;
	int age;
	string gender;
};

// 创建升序排列函数
void bubbleSort(struct hero h_arr[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (h_arr[j].age > h_arr[j + 1].age)
			{
				//此处交换的应该是每一个英雄的位置,而不是每个英雄的年龄进行交换。
				struct hero temp = h_arr[j];
				h_arr[j] = h_arr[j + 1];
				h_arr[j + 1] = temp;
			}
		}
	}
}

// 创建打印函数
void printStruct(struct hero h_arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "英雄名字:" << h_arr[i].name << "\t年龄:" << h_arr[i].age 
			<< "\t性别:" << h_arr[i].gender << endl;
	}
}

int main() {

	// 1、创建英雄结构体数组
	struct hero h_arr[5] = 
	{
		{"刘备", 23, "男"},
		{"关羽", 22, "男"},
		{"张飞", 20, "男"},
		{"赵云", 21, "男"},
		{"貂蝉", 19, "女"}
	};
	int len = sizeof(h_arr) / sizeof(h_arr[0]);

	// 2、调用排序函数对英雄进行升序排列
	bubbleSort(h_arr, len);

	// 3、调用打印函数
	printStruct(h_arr,len);

	system("pause");
	return 0;
}

  • 输出结果
    在这里插入图片描述

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

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

相关文章

元宇宙持续升温,金蝶推出数字员工破圈而来

作者 | 伍杏玲 “金小蝶&#xff0c;请分析今年企业销售事业部的业绩”。 话音刚落&#xff0c;大屏幕展开一张张账务报表&#xff0c;一位身着西装&#xff0c;举止大方得体的数字人条理清晰地回复&#xff1a;“截至今年10月&#xff0c;企业销售事业部在签单金额、新签收入…

数字化转型过程中,企业如何搭建好数据安全?

在企业数字化转型变革中&#xff0c;确保数据安全是企业的责任也是重任。“数据安全”关乎企业数字化发展和未来的商业模式及竞争力&#xff0c;如何在企业数字化转型过程中搭建好“数据安全”的保障&#xff1f; 一、建立数据安全保护意识 互联网时代&#xff0c;有各种各样、…

Vue--》详解Vue组件生命周期的三个阶段

目录 组件生命周期 创建阶段 beforeCreate阶段&#xff1a; created阶段&#xff1a; beforeMount阶段&#xff1a; mounted阶段&#xff1a; 运行阶段 beforeUpdate阶段&#xff1a; updated阶段&#xff1a; 销毁阶段 beforeDestroy阶段&#xff1a; destroyed阶…

windows工作窗口太多,需要频繁切换?摸鱼利器你必须了解下

当我们创作一份内容需要使用到不同窗口的信息时&#xff0c;无比苦恼的就是窗口需要频繁切换了&#xff0c;并且当我们需要参照某个窗口时&#xff0c;这时如果可以把窗口置顶甚至透明窗口效率翻倍&#xff01; WindowTop 是一款窗口自定义设置工具&#xff0c;可将任意窗口置…

[附源码]计算机毕业设计JAVA购买车票系统

[附源码]计算机毕业设计JAVA购买车票系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

怎么把加密的PDF解密?安利几个办公小技巧

大家都知道给pdf文件加密是对文件的一种保护措施&#xff0c;但是如果我们需要对其进行频繁的编辑改动的话&#xff0c;加了密的pdf文件操作起来就很不方便&#xff0c;因为每次的打开都需要输入密码&#xff0c;这个操作其实很浪费时间&#xff0c;其实我只需要将其解密就好了…

用pageOffice文档控件实现 office文档在线编辑

第三方文档控件&#xff0c;pageOffice 系统开发中经常要处理办公文档&#xff0c;如果word&#xff0c;excel&#xff0c;ppt&#xff0c;编辑整理&#xff0c;保存&#xff0c;归档。 开发市场上也有很多第三文文档控件&#xff0c;多年的总结&#xff0c;还是认为pageOffi…

Unity学习之Shader

Shader 是用来实现图像渲染的&#xff0c;用来替代固定渲染管线的可编辑程序。其中Vertex Shader&#xff08;顶点着色器&#xff09;主要负责顶点的几何关系等的运算&#xff0c;Pixel Shader&#xff08;像素着色器&#xff09;主要负责片元颜色等的计算。顶点Shader负责改变…

【毕业设计】微信小程序商城购物系统

文章目录0 前言1 项目介绍1.1 代码工程结构1.2 前端技术1.3 后端技术1.4 实现功能1.4.1 会员管理1.4.2 商城配置1.4.3 商品编辑1.4.4 推广管理1.4.5 订单管理1.4.6 系统管理1.4.7 短信服务平台2 运行效果2.1 前端效果2.2 后端效果3 实现部分源码3.1 前端布局3.2 后端逻辑4 最后…

开箱评测:双十一刚买的云服务器,到底好不好用?

目录前言1. 何为HECS2. 核心特色2.1 易搭建2.2 更实惠2.3 易维护2.4 更安全3. 实践场景3.1 宝塔面板3.2 软件开发3.3 运维部署前言 对开发者和企业来说&#xff0c;双十一首先要购买什么&#xff1f;那必是云服务器。 云服务器&#xff08;Elastic Cloud Server, ECS&#xff…

数据结构:二叉树基础

文章目录一.二叉树的概念及结构1.1概念1.2特殊的二叉树二.二叉树的性质三.小练习3.13.23.3一.二叉树的概念及结构 不熟悉树这个结构的可以看看数据结构:树这篇文章。 1.1概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合: 为空由一个根节点加上两棵别称为左子树和右…

Android动画之帧动画

在Android开发时&#xff0c;为了实现一些动态的炫酷的效果&#xff0c;我们常用到帧动画&#xff0c;View动画&#xff08;补间动画&#xff09;和属性动画&#xff0c;今天就来总结下我在使用帧动画的实现方式。 1、什么是帧动画&#xff1f; 帧动画就是顺序播放一组预先定…

什么是IO

java.io.File类&#xff1a;文件和文件目录路径的抽象表示形式&#xff0c;与平台无关 File 能新建、删除、重命名文件和目录&#xff0c;但 File 不能访问文件内容本身。 如果需要访问文件内容本身&#xff0c;则需要使用输入/输出流。 想要在Java程序中表示一个真实存在的文…

谈谈RabbitMQ的五种消息模型以及SpringAMQP的使用

目录一、前言1. RabbitMQ中的基本概念2. docker部署RabbitMQ3. AMQP与JMS的简单介绍4. 演示demo搭建结构二、Basic Queue三、Work Queue四、发布订阅模式1. Fanout2. Direct3. Topic五、消息转换器1. 默认转换器2. 配置JSON转换器一、前言 1. RabbitMQ中的基本概念 message 消…

逻辑回归损失函数原理笔记

损失函数&#xff1a; 之前一直想不明白这个式子为什么可以当损失函数。所以记录一下。 首先&#xff0c;假如一个属于1类的样本&#xff0c;经过预测&#xff0c;h(x)0.3,得出0.3的概率是属于1类&#xff0c;也就是0.7的概率是属于0类&#xff0c;那么其误差就是0.7。 相反&…

配置七牛云的自定义域名以及配置域名CNAME

背景&#xff1a;最近在使用七牛云的过程中发现一个问题&#xff0c;七牛云的测试域名是有时效限制的且到期后重新申请会改变&#xff0c;自己业务方生产和测试环境需要使用固定的域名来配置图片访问&#xff0c;这时就需要绑定到自己的域名了。 1、配置七牛云自定义域名 这个…

学Golang,看这一篇

去年学了一遍 Golang&#xff0c;发现都给整忘了&#xff0c; 好饭不怕晚&#xff0c;再次二刷。 其实学好 Golang 并不难&#xff0c;关键是要找到它和其它语言不同和众里寻他千百度相通的微妙之处&#xff0c;就能很优雅地使用 Golang&#xff0c;以下会涉及较多知识点。特殊…

(Java高级教程)第一章Java多线程基础-第一节6:多线程案例

文章目录一&#xff1a;单例模式&#xff08;1&#xff09;设计模式概述&#xff08;2&#xff09;单例模式概述&#xff08;3&#xff09;单例模式实现A&#xff1a;饿汉模式B&#xff1a;懒汉模式①&#xff1a;单线程版②&#xff1a;多线程版③&#xff1a;多线程版&#x…

alpha模型:打开量化投资的黑箱;附创业板布林带策略代码:年化15%。

原创文章第108篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 关于量化投资&#xff0c;我们写了不少文章。从数据准备&#xff0c;预处理&#xff0c;因子特征工程&#xff0c;因子分析&#xff0c;规则策略&#xff0c;模型&#xff0c…

平安城市解决方案-最新全套文件

平安城市解决方案-最新全套文件一、建设背景目前平安城市视频监控面临的主要问题&#xff1a;1、看不清2、传不回3、存不下4、找不着5、易泄露二、思路架构三、建设方案四、获取 - 平安城市全套最新解决方案合集一、建设背景 平安城市是一个特大型、综合性非常强的管理系统&am…