[C++基础学习-07]----C++结构体详解

前言

        结构体(Struct)是C++中一种用户定义的复合数据类型,用于存储不同类型的数据项。结构体可以包含不同类型的数据成员,这些数据成员可以是基本类型(如int、float、char等),也可以是数组、指针、其他结构体等。

正文

01-结构体简介    

        结构体的基本语法:

struct 结构体名 {数据类型 成员1;数据类型 成员2;// 更多成员
};// 声明结构体变量
struct 结构体名 变量名;// 初始化结构体变量
结构体名 变量名 = {初始值1, 初始值2, ...};

02-结构体的定义和使用    

        具体代码和解释如下:

#include<iostream>
using namespace std;
#include<string>
// 1、创建学生数据类型  :学生包括 (姓名,年龄,分数)
// 自定义的数据类型,一些类型的集合组成的一个类型
// 语法 struct 类型名称(做到见名知意) {成员列表}
struct Student
{// 成员列表// 姓名string name;// 年龄int age;// 分数int score;}s3;// 2、通过类型创建具体学生
// 2.1、struct 结构体名 变量名
// 2.2、struct 结构体名 变量名 ={初始值1,初始值2 .....}
// 2.3、定义结构体时顺便创建变量int main()
{/*  下面三种定义方法中,1和2使用最多*/// 2.1、struct 结构体名 变量名Student s1;  // struct Student s1;这里定义时,C++中可以直接将结构体关键字省略,结果一样s1.name = "张三";s1.age = 20;s1.score = 100;cout << "姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl;// 2.2、struct 结构体名 变量名 ={初始值1,初始值2 .....}Student s2 = {"李四",19,80};cout << "姓名: " << s2.name << " 年龄: " << s2.age << " 分数: " << s2.score << endl;// 2.3、定义结构体时顺便创建变量s3.name = "王五";s3.age = 21;s3.score = 91;cout << "姓名: " << s3.name << " 年龄: " << s3.age << " 分数: " << s3.score << endl;system("pause");return 0;
}

03-结构体数组    

        具体代码和解释如下:

#include<iostream>
using namespace std;
#include<string>// 结构体数组
// 1、定义结构体数组
struct Student
{// 成员列表// 姓名string name;// 年龄int age;// 分数int score;};int main()
{// 2、创建结构体数组struct Student stuArray[3]={{"张三",18,100},{"李四",20,89},{"王五",21,90}};// 3、给结构体数组中国的某一个进行更换 stuArray[2].name = "赵六";  // stuArray[2] 指的是数组的第三个人stuArray[2].age = 22;stuArray[2].score = 95;// 4、遍历结构体数组中的参数  打印输出后可以发现,第三个人的信息已经被更改for (int i = 0; i < 3;i++){cout << " 姓名: "  << stuArray[i].name << " 年龄:  " << stuArray[i].age << " 分数: " << stuArray[i].score << endl;}system("pause");return 0;
}

04-结构体指针    

        具体代码和解释如下:

#include<iostream>
using namespace std;
#include<string>// 1、定义学生结构体
struct Student
{// 成员列表// 姓名string name;// 年龄int age;// 分数int score;};int main()
{// 2、创建学生结构体变量Student s = { "张三",18,100 };// 3、通过指针指向结构体变量Student *p = &s; //  将出现这种错误,无法从“Student *”转换为“int *”,因为&s返回的是一个student数据类型,因此,指针应该定义该类型// 4、遍历结构体数组中的参数  打印输出后可以发现,第三个人的信息已经被更改cout << "姓名: " << p->name << " 年龄: " << p->age<< " 分数: "<<p->score << endl;system("pause");return 0;
}

05-结构体嵌套结构体    

        具体代码和解释如下:

#include<iostream>
using namespace std;
#include<string>// 1、定义学生结构体
struct Student
{// 成员列表// 姓名string name;// 年龄int age;// 分数int score;};// 2、定义老师结构体struct teacher
{ int id;  // 教师编号string name;  // 教师姓名int age;    // 教师年龄Student stu;  // 辅导学生
};int main()
{// 结构体嵌套结构体// 创建老师teacher t;t.name = "王五";t.id = 000001;t.age = 50;t.stu.name = "张三";t.stu.age = 20;t.stu.score = 100;cout << "老师姓名: " << t.name << " 老师编号: " << t.id<<" 老师年龄: "<<t.age<< " 学生姓名: " << t.stu.name << " 年龄: " << t.stu.age<< " 成绩: " << t.stu.score<< endl;system("pause");return 0;
}

06-结构体做函数参数    

        具体代码和解释如下:

#include<iostream>
using namespace std;
#include<string>// 1、定义学生结构体
struct Student
{// 成员列表// 姓名string name;// 年龄int age;// 分数int score;};// 打印学生信息的函数
// 1、值传递
void printStudent1(Student s)
{s.age = 100;cout << "子函数1中打印:" << " 姓名: " << s.name << " 年龄: " << s.age << " 成绩: " << s.score << endl;
}
// 2、地址传递
void printStudent2(struct Student *p)
{p->age = 100;cout << "子函数2中打印:" << " 姓名: " << p->name << " 年龄: " << p->age << " 成绩: " << p->score << endl;
}int main()
{// 结构体做函数参数,将结构体作为参数向函数传递// 将学生传入一个参数中,要打印学生的所有信息// 创建结构体变量Student s;s.name = "王五";	s.age = 20;s.score = 100;//	printStudent1(s);printStudent2(&s);   // 应该放在打印之前cout <<"main函数中打印:"<< " 姓名: " << s.name << " 年龄: " << s.age << " 成绩: " << s.score << endl;system("pause");return 0;
}

07-结构体中const使用场景    

        具体代码和解释如下:

#include<iostream>
using namespace std;
#include<string>// 1、定义学生结构体
struct Student
{// 成员列表// 姓名string name;// 年龄int age;// 分数int score;};void printStudent(const Student *p)
{// 这里加入const之后,便不可以再对实参进行修改cout << "姓名: " << p->name << " 年龄: " << p->age << " 成绩: " << p->score << endl;
}int main()
{// 结构体做函数参数,将结构体作为参数向函数传递// 将学生传入一个参数中,要打印学生的所有信息// 由于此时只有一个学生,因此觉得打印出来非常简单,但是如果一个学校的人都在里面,// 都打印出来,将非常占用内存,因此,定义打印函数时,最佳的方法就是定义一个指针,永远只存有四个字节Student s;s.name = "王五";s.age = 20;s.score = 100;printStudent(&s);system("pause");return 0;
}

08-结构体案例1    

        具体代码和解释如下:

#include <iostream>
using namespace std;
#include <string>
#include <ctime>// 定义学生结构体
struct Student
{// 成员列表// 姓名string sName;// 分数int score;};//老师的结构体定义
struct Teacher
{string tName;struct Student sArray[5];};// 创建给老师和学生信息赋值的函数
void allocateSpace(Teacher tArray[], int len)
{string nameSeed = "ABCDE";for (int i = 0; i < len;i++){ tArray[i].tName = "Teacher_";tArray[i].tName += nameSeed[i];// 通过循环给每名老师带的学生赋值for (int j = 0; j < 5;j++){tArray[i].sArray[j].sName = "Student_";tArray[i].sArray[j].sName += nameSeed[j];int random = rand() % 61 + 40;  // 40~100tArray[i].sArray[j].score = random;}}}
// 打印老师及学生信息
void printInof(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、创建三名老师的数组Teacher tArray[3];int len = sizeof(tArray) / sizeof(tArray[0]);// 2、通过函数给三名老师的信息赋值,并给老师带的学生信息赋值allocateSpace(tArray, len);// 3、打印所有老师和学生的信息printInof(tArray,len);system("pause");return 0;
}

09-结构体案例2    

        具体代码、解释和运行结果如下:

#include <iostream>
using namespace std;
#include <string>
#include <ctime>// 定义英雄结构体
struct Hero
{// 成员列表// 姓名string hName;// 分数int age;// 性别string sex;};void printInof1(Hero hArray[], int len)
{cout << "排序前: " << endl;for (int i = 0; i < len; i++){cout <<"姓名: " << hArray[i].hName <<" 年龄: "<<hArray[i].age<<" 性别: "<<hArray[i].sex<< endl;}}void bubbleSort(Hero hArray[], int len)
{for (int i = 0; i < len-1;i++){for (int j = 0; j < len - i - 1;j++){if (hArray[j].age>hArray[j+1].age){Hero temp = hArray[j];hArray[j] = hArray[j + 1];hArray[j + 1] = temp;}}}
}void printInof2(Hero hArray[], int len)
{cout << "排序后: " << endl;for (int i = 0; i < len; i++){cout << "姓名: " << hArray[i].hName << " 年龄: " << hArray[i].age<< " 性别: " << hArray[i].sex << endl;}}int main()
{// 1、创建英雄数组Hero hArray[5] = {{ "刘备",23,"男" },{ "关羽",22,"男" },{ "张飞",20,"男" },{ "赵云",21,"男" },{ "貂蝉",19,"女" },};int len = sizeof(hArray) / sizeof(hArray[0]);// 2、打印排序前的英雄printInof1(hArray, len);// 3、通过函数对英雄信息进行冒泡排序bubbleSort(hArray, len);// 4、打印排序后的顺序printInof2(hArray, len);system("pause");return 0;
}

总结

        结构体可以用来组织和管理多个相关的数据项,方便对它们进行统一处理。在C++中,结构体还可以包含函数成员,这种结构体称为类(Class),用于实现面向对象编程。结构体和类是C++中重要的数据类型,被广泛应用于各种程序设计场景中。

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

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

相关文章

【SSM进阶学习系列丨分页篇】PageHelper 分页插件导入集成实践

文章目录 一、说明什么是分页PageHelper介绍 二、导入依赖三、集成Spring框架中四、编写Service五、编写Controller六、编写queryAllByPage页面展示数据 一、说明 什么是分页 ​ 针对分页&#xff0c;使用的是PageHelper分页插件&#xff0c;版本使用的是5.1.8 。 ​ 参考文档…

第十三届蓝桥杯国赛真题 Java C 组【原卷】

文章目录 发现宝藏试题 A: 斐波那契与 7试题 B: 小蓝做实验试题 C: 取模试题 D: 内存空间试题 E \mathrm{E} E : 斐波那契数组试题 F: 最大公约数试题 G: 交通信号试题 I: 打折试题 J: 宝石收集 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…

为什么 IP 地址通常以 192.168 开头?(精简版)

网络通讯的本质就是收发数据包。如果说收发数据包就跟收发快递一样。IP地址就类似于快递上填的收件地址和发件地址一样&#xff0c;路由器就充当快递员的角色&#xff0c;在这个纷繁复杂的网络世界里找到该由谁来接收这个数据包&#xff0c;所以说&#xff1a;IP地址就像快递里…

AG32 MCU在触摸屏的应用(AGM FPGA/MCU行业应用)

传统的屏驱MCU常见应用于洗衣机、空调、空调面板、仪器仪表等人机交互界面显示场景中&#xff0c;通常是以段码的形式显示设备运转的时间、温度、测量结果等简单运行数据&#xff0c;随着人机交互需求丰富化&#xff0c;智能家居设备、摩托车、电动车等产品也逐步增加了屏幕显示…

2024年第六届先进材料、机械和制造国际会议(AMMM 2024)即将召开!

2024年第六届先进材料、机械和制造国际会议&#xff08;AMMM 2024&#xff09;将于2024年9月6-8日在日本东京举行。AMMM 2024将以国际材料&#xff0c;机械和制造为主题&#xff0c;吸引到来自多个领域的研究人员和学者相聚在一起分享知识&#xff0c;讨论想法&#xff0c;并了…

Android 音视频播放器 Demo(一)—— 视频解码与渲染

本篇作为 Android 音视频实战系列的第二篇文章&#xff0c;主要介绍视频解码与渲染过程。本系列文章目录如下&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff…

字符函数与字符串函数(2)

遇见她如春水映莲花 字符函数与字符串函数&#xff08;2&#xff09; 前言一、strcatstrncat 二、strcmpstrncmp在这里插入图片描述 三、strstr四、strtok五、strerror总结 前言 根据上期字符函数与字符串函数我们可以了解到字符函数与个别字符串函数的用法&#xff0c; 那么接…

STM32——GPIO篇

技术笔记&#xff01; 1. 什么是GPIO&#xff1f; GPIO是通用输入输出端口&#xff08;General-purpose input/output&#xff09;的英文简写&#xff0c;是所有的微控制器必不可少的外设之一&#xff0c;可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功…

当管道运算符遇上无限可能:探索数据流的奇妙之旅

文章目录 序言目的进程间通信的理解进程间通信的发展历史管道创建验证管道的大小管道的4种情况管道的5种特征 序言 通过该命令计算了在当前路径下一共有多少个文件夹的任务 进程虽然有独立性,但是进程并不孤僻,他们之间也会相互进行协作共同完成一件事 这个前提是他们之间的信…

嵌入式全栈开发学习笔记---C语言笔试复习大全7(编程题1~8)

目录 1、200&#xff5e;300之间能被3整除的数&#xff0c;5个一行输出&#xff1b; 2、求两个数的最大公约数、最小公倍数&#xff1b; 3、输入十个数&#xff0c;求出平均值&#xff1b; 4、通过编程实现,统计1~n有多少个9&#xff1b; 5、有1、2、3、4个数字&#xff0…

C#简单创建DLL文件并调用

DLL是Dynamic Link Library的缩写&#xff0c;意为动态链接库。动态链接库其实是由编译器将一系列相关的类型编译、链接并封装成一个独立的文件&#xff0c;与对其进行调用的程序分开。这样一个独立的文件相当于程序的一个模块&#xff0c;如果需要对程序进行更新&#xff0c;只…

ESP32-C3第二路串口(非调试)串口打通(1)

1. 概述与引脚复用 《ESP32-C3 系列芯片技术规格书》中提到&#xff0c;ESP32-C3系列芯片中有两路串口。 第1路串口就是常用的调试串口&#xff0c;在笔者使用的ESP32-C3-DevKitC-02开发板中&#xff0c;这一路串口通过CP2102 USB转UART桥芯片与电脑的USB口相连接&#xff0c;…

42 线程池

一种线程使用模式&#xff0c;线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。线程池维护多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价&#xff0c;线程池不仅能保证内核的充分利用&#xf…

redis中的双写一致性问题

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

数据结构------栈的介绍和实现

目录 1.栈的一些初步认识 2.栈的实现 3.相关的函数介绍 &#xff08;1&#xff09;栈的初始化 &#xff08;2&#xff09;栈的销毁 &#xff08;3&#xff09;栈的数据插入 &#xff08;6&#xff09;判断是否为空 &#xff08;7&#xff09;栈的大小 4.栈的实现完整…

【数据结构(邓俊辉)学习笔记】列表01——从向量到列表

文章目录 0.概述1. 从向量到列表1.1 从静态到动态1.2 从向量到列表1.3 从秩到位置1.4 列表 2. 接口2.1 列表节点2.1.1 ADT接口2.1.2 ListNode模板类 2.2 列表2.2.1 ADT接口2.2.2 List模板类 0.概述 学习了向量&#xff0c;再介绍下列表。先介绍下列表里的概念和语义&#xff0…

【HM】DevEco Studio如何使用代码编程AI助手

大家可能都有用过或了解过github copilot插件&#xff0c;确实为我们编码智能、提升开发效率有很大的帮助。推荐两款国产的ai编程插件&#xff0c;分别是华为的CodeArts Snap和阿里的通义灵码。 DevEco 中如何安装通义灵码&#xff1f; 一、下载通义灵码离线安装包 打开官网…

每日OJ题_贪心算法二⑤_力扣870. 优势洗牌(田忌赛马)

目录 力扣870. 优势洗牌&#xff08;田忌赛马&#xff09; 解析代码 力扣870. 优势洗牌&#xff08;田忌赛马&#xff09; 870. 优势洗牌 难度 中等 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引…

golang学习笔记(内存逃逸分析)

golang的内存逃逸 逃逸分析&#xff08; Escape analysis&#xff09; 是指由编译器决定内存分配的位置&#xff0c; 不需要程序员指定。 函数中申请一个新的对象。 如果分配在栈中&#xff0c; 则函数执行结束可自动将内存回收&#xff1b;如果分配在堆中&#xff0c; 则函数…

解决layui的bug 在layui tree 组件中 禁用选中父节点后自动选中子节点功能

最近做权限管理后台&#xff0c;用了layui tree 组件&#xff0c;发现选中了父节点后&#xff0c;自动选中了子节点。不满足现实业务需求。所以微调了下源代码。 在用树形组件中&#xff0c;在用文档中 tree.setChecked(demoId, [2, 3]); //批量勾选 id 为 2、3 的节点 用这句…