【教程】C++语言基础学习笔记(十)——结构体

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【C++语言基础学习】系列文章

第一章 《项目与程序结构》
第二章 《数据类型》
第三章 《运算符》
第四章 《流程控制》
第五章 《Vector向量》
第六章 《String字符串》
第七章 《Array数组》
第八章 《函数》
第九章 《指针》
第十章 《结构体》


文章目录

  • 【C++语言基础学习】系列文章
  • 一、结构体定义
  • 二、结构体使用
    • (一)结构体数组
    • (二)结构体指针
  • 三、结构体嵌套


一、结构体定义

结构体(Struct)是一种自定义的数据类型,可以用于组织和管理多个不同类型的数据成员。在C++中,结构体可以用来定义一个包含多个相关数据的复合数据类型。
结构体的定义通常包含以下几个部分:

  1. 关键字struct标识结构体的开始。
  2. 结构体名称,用来标识这个结构体类型。
  3. 花括号{},括号内是结构体的成员列表。
  4. 每个成员的类型和名称。

语法如下。

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

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

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值,成员2值… }
  • 定义结构体时顺便创建变量

定义的示例如下。

struct Student
{// 成员类型// 姓名string name;// 年龄int age;// 分数int score;
};

以上示例创建了一个名叫Student的结构体,并在成员列表中添加了姓名name、年龄age和分数score三个属性。从定义成员列表的方式其实可以看到,成员的组成也是由自定义各种数据类型来实现的。
在已经创建了结构体的前提下,通过结构体创建变量则如下所示。

#include "test.h"
#include <iostream>
#include <string>using namespace std;void test::Test()
{struct Student{// 成员类型// 姓名string name;// 年龄int age;// 分数int score;}s3;//第三种方式// 第一种方式struct Student s1;s1.name = "小张";s1.age = 18;s1.score = 100;cout << " 姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;// 第二种方式struct Student s2 = { "小李",19,80 };cout << " 姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;// 第三种方式s3.name = "小王";s3.age = 20;s3.score = 60;cout << " 姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;
}

阅读以上代码:第一种方式是在声明结构体建立一个变量s1后,通过成员运算符.访问结构体Student的各个属性(成员),然后逐个赋值;第二种方式是在声明建立变量s2后直接在花括号{}内依次赋值;第三种方法则是在结构体定义后紧跟着建立一个变量s3,接着再通过与第一种方式相同的操作依次访问成员进行赋值。
但在实际应用中,通常使用第一种和第二种方式较多,因为第三种定义方式变量定义和赋值语句很可能相隔太远,可读性较差,一般不进行使用。
示例代码返回结果如下。

姓名:小张 年龄:18 分数:100
姓名:小李 年龄:19 分数:80
姓名:小王 年龄:20 分数:60

二、结构体使用

(一)结构体数组

结构体数组是指以结构体作为元素类型的数组。它可以用来同时存储和管理多个结构体对象的集合。通过结构体数组,可以方便地对多个结构体对象进行批量操作。
其语法如下。

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

仍然使用之前定义的Student结构体作为示例。

#include "test.h"
#include <iostream>
#include <string>using namespace std;void test::Test()
{struct Student{string name;int age;int score;};// 创建结构体数组struct Student arr[3] ={{"小张",18,100},{"小李",19,80},{"小王",20,60}};// 给结构体数组的元素赋值arr[2].score = 70;// 遍历打印结构体数据for (int i = 0; i < 3; i++){cout << " 姓名:" << arr[i].name<< " 年龄:" << arr[i].age<< " 分数:" << arr[i].score << endl;}
}

从代码可以看到,通过数组赋值结构体,可以使得成员赋值更为简略,同时,还可以通过访问数组中元素的属性方式直接修改赋值。

(二)结构体指针

结构体指针是指向结构体类型的指针变量。它可以用来存储和操作结构体对象的地址,通过指针可以方便地访问和修改结构体对象的成员。
以下是简单的示例。

#include "test.h"
#include <iostream>
#include <string>using namespace std;void test::Test()
{struct Student{string name;int age;int score;};Student s = { "小张",18,100 };Student* p = &s;cout << " 姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
}

从示例代码中,可以看到指针的类型必须和结构体创建的类型相同,而不能用普通的类似整型、浮点型的数据类型来作为指针的数据类型。
值得注意的是,在C++中,一旦定义了相应的结构体数据类型,在定义变量时可以不声明结构体关键字struct,直接使用结构体创建的数据类型Student即可。还有一点是,在访问结构体的属性时,这里使用的成员操作符是通过箭头->来访问指针的属性。
返回结果如下。

姓名:小张 年龄:18 分数:100

三、结构体嵌套

结构体嵌套是指在一个结构体中包含另一个结构体作为成员。通过结构体嵌套,可以创建更复杂的数据结构,将多个结构体对象组合在一起,形成更复杂的数据类型。
以下是简单的示例。

#include "test.h"
#include <iostream>
#include <string>using namespace std;void test::Test()
{struct student{string name;int age;int score;};struct teacher{string name;// 教师姓名int age;// 教师年龄student stu;// 辅导的学生};teacher t;t.name = "老刘";t.age = 50;t.stu.name = "小张";t.stu.age = 18;t.stu.score = 100;cout << " 老师姓名:" << t.name << endl;cout << " 老师年龄:" << t.age << endl;cout << " 老师辅导的学生姓名:" << t.stu.name << endl;cout << " 学生年龄:" << t.stu.age << endl;cout << " 学生成绩:" << t.stu.score << endl;
}

根据以上代码,只有首先创建一个student结构体,在创建teacher结构体内的嵌套属性时才可以访问。一旦结构体作为另一个结构体的属性创建完成,就可以作为那个结构体的属性进行访问。
返回结果如下。

老师姓名:老刘
老师年龄:50
老师辅导的学生姓名:小张
学生年龄:18
学生成绩:100


我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言------一种思路解决实际问题

1.比赛名次问题 ABCDE参加比赛&#xff0c;那么每个人的名次都有5种可能&#xff0c;即1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff1b; int main() {int a 0;int b 0;int c 0;int d 0;int e 0;for (a 1; a < 5; a){for (b 1; b < 5; b){for…

Python eval函数

在Python编程中&#xff0c;eval()函数是一个强大且灵活的内置函数&#xff0c;用于动态执行字符串表达式或代码。尽管eval()函数具有强大的功能&#xff0c;但它也带来了一些潜在的安全风险&#xff0c;因此在使用时需要谨慎。本文将深入探讨eval()函数的用法、语法、示例代码…

网红铁头因涉黄经历遭全网封杀

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 铁头根本没意识到自己是公众人物了。 知名网红“铁头惩恶扬善”帐号被全网封禁&#xff0c;原因是因为遭到别人举报&#xff0c;1月12日凌晨“铁头”在直播的时候呢&#xff0c;自爆其涉黄经历。 铁头居然自己在直…

刚刚下载!unity应该怎么操作?来看看基操

也用了挺长时间unity了&#xff0c;有时候还是容易忘记基础使用&#xff0c;写一些吧。 以下应该是前年吧在学习飞宇unity时简单记录的。 文章目录 01游戏引擎是啥&#xff1f;02 Unity&#xff0c;你的优势呢&#xff1f;03 动~下载 & 安装04 你好&#xff0c;编辑器05 迈…

SpringCloud之Eureka注册中心和负载均衡

SpringCloud之Eureka注册中心和负载均衡 微服务技术栈认识微服务单体架构分布式架构微服务 微服务拆分及远程调用微服务拆分注意事项 Eureka注册中心提供者与消费者原理分析服务调用出现的问题Eureka的作用 使用流程1、搭建EurekaServer2、注册user-service3、在order-service完…

2024 年 7 款最佳电脑录屏软件 [免费和付费]

录屏是捕获桌面上活动的软件应用程序。用户可以根据自己的要求创建视频记录。免费屏幕录像机广泛用于演示、演示、教程、游戏等。 录音机还有助于内容创建、远程协作和员工培训。这些录音机具有多种特性和功能。它提供了音频录制、网络摄像头集成和快速编辑工具的选项。您可以根…

python 人脸检测器

import cv2# 加载人脸检测器 关键文件 haarcascade_frontalface_default.xml face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 读取图像 分析图片 ren4.png image cv2.imread(ren4.png) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行人脸…

猫头虎分享已解决Bug || 数据库锁定(Database Locking):DBLockTimeout, DatabaseDeadlock

猫头虎分享已解决Bug &#x1f43e; || 文件系统错误&#xff08;File System Error&#xff09;&#xff1a;FileSystemCorruption, FileSystemNotMounted 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; …

抽象的问题1

vue3&#xff0c;在使用v-mode绑定属性时&#xff0c;发生了奇怪的问题&#xff0c;渲染失败了 代码如下 <template><div><form><div>账号<input v-model"form_user_Data.username" type"text"></div><div>密…

云备份项目:在云端保护您的数据【一、初识】

桃李不言&#xff0c;下自成蹊 文章目录 项目简介项目设计方案服务端功能划分客户端功能划分 项目环境搭建环境准备第三方库JsonCppbundle数据压缩库httplib 总结 ☘️项目源代码&#xff1a;云备份 ☘️云备份专栏&#xff1a;云备份 项目简介 云备份系统是一个自动化的备份解…

SpringBoot+Tess4J实现本地与远程图片的文字识别

Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字 一、添加依赖 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><vers…

CH32V003软件模拟SPI驱动XL2400P

XL2400P芯片引脚 选用的模块&#xff0c;CH32V003与此模块连接 芯领XL2422开发板作为发送测试数据用 SPI接口注意 SPI接口采用3线制&#xff0c;DATA引脚既是输出引脚又是输入引脚。目前我还没有用硬件SPI实现驱动测试&#xff0c;只实现了软件模拟驱动测试。 软件模拟参考压…