当前位置: 首页 > news >正文

C++——结构体

1,结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。像int(整型),浮点型,bool型,字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义的一种数据类型

2,结构体定义和使用

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

通过结构体创建变量的方式有三种,struct关键字不可省略:

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = {成员1值,成员2值...}
  • 定义结构体时顺便创建变量
#include<bits/stdc++.h>
using namespace std;
//1,创建学生数据类型 :学生包括(姓名,年龄,分数)
//自定义数据类型,一些类型集合组成的一个类型
//语法  struct 类型名称{ 成员列表 } 
struct Student{//成员列表//姓名string name; //年龄 int age;//成绩 int score;
}s3;//顺便创建结构体变量s3. 
//2,通过学生类型创建具体学生 
int main(){//2.1 struct Student s1Student s1;s1.name="张三";s1.age=18; s1.score=100;cout<<"姓名: "<<s1.name<<"年龄: "<<s1.age<<"成绩: "<<s1.score<<endl; //2.2 struct Student s2={...}Student s2={"李四",19,80};cout<<"姓名: "<<s2.name<<"年龄: "<<s2.age<<"成绩: "<<s2.score<<endl; //2.3 在定义结构体时顺便创建结构体变量 s3.name="王五";s3.age=20;s3.score=90;cout<<"姓名: "<<s3.name<<"年龄: "<<s3.age<<"成绩: "<<s3.score<<endl; 
} 

结构体在具象化的时候,可以通过三种方式创建具体的类型:

  •  struct Student s1
  •  struct Student s2={...}
  •  在定义结构体时顺便创建结构体变量 

3,结构体数组

作用:将自定义的结构体放入到数组中方便维护,也就是数组中的每一个元素都是我们自定义的同一种数据结构类型,也就是结构体。

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

示例:

#include<bits/stdc++.h>
using namespace std;
//结构体数组
struct student{string name;int age;int score;
}; 
int main(){struct student stuarry[3]={{"july",18,100},{"miss.li",20,90},{"zhang",21,130}};stuarry[1].name="san";stuarry[1].age=21;stuarry[1].score=100;for(int i=0;i<3;i++){cout<<"姓名:"<<stuarry[i].name<<endl;cout<<"年龄:"<<stuarry[i].age<<endl;cout<<"成绩:"<<stuarry[i].score<<endl;}
}

4,结构体指针

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

  • 利用操作符->可以通过结构体指针访问结构体属性
struct student{string name;int age;int score;
};
int main(){//创建学生结构体变量student s={"zhang",18,100}; //通过指针指向结构体变量student *p=&s;//通过指针访问结构体变量中的数据 p->age=20;cout<<"name= "<<p->name<<"age= "<<p->age<<"score= "<<p->score<<endl; } 

通过上述例子我们可以总结出来:

  • 指针在定义时,指针等号左右的数据结构要对应,int对int,float对float,struct对struct。

  • 指针通过->操作符可以访问成员

5,结构体嵌套结构体     

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

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

嵌套示意图:

#include<bits/stdc++.h>
using namespace std;
struct student{string name;int age;int score;
};//定义学生结构体 
struct teacher{int id;string name;int age;student stu;//代表这个老师所带的学生 
};
int main(){teacher t;t.id=1000;t.age=50;t.name="Mr.li";t.stu.age=10;t.stu.name="xiaowang";t.stu.score=60;cout<<"teacher`s name is "<<t.name<<endl;cout<<"teacher`s age is " <<t.age<<endl;cout<<"teacher`s id is "<<t.id<<endl;cout<<"student`s age is "<<t.stu.age<<endl;cout<<"student`s score is "<<t.stu.score<<endl;cout<<"student`s name is "<<t.stu.name<<endl;
} 

                            

6,结构体做函数参数

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

传递方式有两种:

  • 值传递(形参修饰不会改变实参)
  • 地址传递(如果函数形参发生改变,实参也会跟着改变)

示例:

#include<bits/stdc++.h>
using namespace std;
struct student{string name;int age;int score;
};//定义学生结构体
void printstudent1(struct student s){s.age=100;cout<<"子函数1中,姓名:"<<s.name<<"年龄为 "<<s.age<<"成绩为 "<<s.score<<endl;
}
void printstudent2(struct student *p){p->age=100;cout<<"子函数2中,姓名:"<<p->name<<"年龄为:"<<p->age<<"成绩为:"<<p->score<<endl; 
}
int main(){student s;s.name="Bob";//实参 s.age=20;s.score=85;printstudent1(s);// 值传递,形参修饰实参,不会改变实参的值 printstudent2(&s);//地址传递 cout<<"main函数中"<<"姓名:"<<s.name<<"年龄为 "<<s.age<<"成绩为 "<<s.score<<endl;
}

 主函数里的赋值为实参,函数中的赋值为形参,大家可以相应修改两种参数传递方式的参数值看看主函数里的实参会怎么变化,得出的结论亦是上面两种结论。值传递修改形参不会改变实参的值,地址传递则会修改实参的值,具体原理参照C++——函数-CSDN博客。

最根本的原理在于:值传递参数时是独立开辟了一些内存空间,而地址传递则是用指针直接指向实参地址

7,结构体中const使用场景

作用:用const来防止误操作

struct student{string name;int age;int score;
};//定义学生结构体
void printstudent(const student *stu){stu->age=30;  加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作cout<<"name is "<<stu->age;
}

上述函数中指针结构体加入const后,结构体中的数据变不允许修改,一旦修改便会报错。

8,结构体案例

案例1

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

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

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

最终打印出老师数据以及老师所带的学生数据。

#include<bits/stdc++.h>
using namespace std;
struct student{string name;int score;	
};//定义学生结构体
struct teacher{string name;student arrstudent[5];
};
//给老师和学生赋值的函数
void teacher(struct teacher array[],int len){string nameseed="ABCDE";for(int i=0;i<len;i++){array[i].name="teacher_";array[i].name+=nameseed[i];for(int j=0;j<5;j++){array[i].arrstudent[j].name="student_";array[i].arrstudent[j].name+=nameseed[j];int random=rand()%60+40;array[i].arrstudent[j].score=random;}}} 
void print(struct teacher array[],int len){for(int i=0;i<len;i++){cout<<" teacher`s name is "<<array[i].name<<endl;for(int j=0;j<5;j++){cout<<"student`s name is "<<array[i].arrstudent[j].name<<"score is "<<array[i].arrstudent[j].score<<endl;} }
}int main(){struct teacher array[3]; int len=sizeof(array)/sizeof(array[0]);teacher(array,len);print(array,len);
}

案例2 

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

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

    {"刘备",23,"男"},
    {"关羽",22,"男"},
    {"张飞",20,"男"},
    {"赵云",21,"男"},
    {"貂蝉",19,"女"}

#include<bits/stdc++.h>
using namespace std;
struct hero{string name;int age;string sex;
};//定义学生结构体
void bubble(struct 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){struct hero temp=harray[j];//再次定义一个结构体接收。 harray[j]=harray[j+1];harray[j+1]=temp;}}}for(int i=0;i<5;i++){cout<<"排序后姓名为:"<<harray[i].name;cout<<"\t排序后年龄为:"<<harray[i].age;cout<<"\t排序后性别为:"<<harray[i].sex;cout<<endl;}}
int main(){struct hero harray[5]={{"刘备",23,"男"},{"关羽",22,"男"},{"张飞",20,"男"},{"赵云",21,"男"},{"貂蝉",19,"女"} }; int len=sizeof(harray)/sizeof(harray[0]);bubble(harray,len);}

此案例的关键在于,冒泡排序中,要定义一个新的结构体代替作为temp临时代替量接收被替换的全部内容。

相关文章:

C++——结构体

1&#xff0c;结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。像int&#xff08;整型&#xff09;&#xff0c;浮点型&#xff0c;bool型&#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…...

C++技术要点总结, 面试必备, 收藏起来慢慢看

目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题&#xff1f; 2.6. 内存对齐 2.7. 什么是内存泄露 …...

VR数字展厅,平面静态跨越到3D立体化时代

近些年&#xff0c;VR的概念被越来越多的人提起&#xff0c;较为常见的形式就是VR数字展厅。VR数字展厅的出现&#xff0c;让各地以及各行业的展厅展馆的呈现和宣传都发生了很大的改变和革新&#xff0c;同时也意味着展览传播的方式不再局限于原来的图文、视频&#xff0c;而是…...

Linux中LVM实验

LVM实验&#xff1a; 1、分区 -L是大小的意思-n名称的意思 从vg0&#xff08;卷组&#xff09;分出来 2、格式化LV逻辑卷 LVM扩容 如果icdir空间不够了&#xff0c; 扩展空间lvextend -L 5G /dev/vg0/lv1 /dev/vg0/lv1(pp,vg,lv) 刷新文件系统xfs_growfs /lvdir VG扩容 …...

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

gitlab.rb主要配置

根据是否docker安装,进入挂载目录或安装目录 修改此文件,我一般是在可视化窗口中修改,有时候也在命令行手敲 将下面的配置复制到该文件中 external_url http://192.168.100.50 # nginx[listen_port] = 8000 (docker安装的这一行不需要,因为端口映射导致此处修改会导致访问…...

网络协议基础

tcp/ip协议簇 TCP/IP协议族 网络接口层(没有特定的协议) 物理层 数据链路层 网络层: IP (v4/v6) ARP(地址解析协议) RARP . ICMP (Internet控制报文协议) IGMP 传输层: TCP (传输控制协议) UDP (用户数据报协议) 应用层: 都是基于传输层协议的端口&#xff0c;总共端口0~65535 …...

Mac使用adb调试安卓手机

0x00 背景 最近windows电脑休息&#xff0c;用mac办公比较多&#xff0c;手机用时间长了&#xff0c;不太灵光&#xff0c;准备修理一番。于是要用mac调试下android手机。配置略显麻烦&#xff0c;网上的步骤多参差不齐。估计是入门步骤&#xff0c;大佬们也懒得写的太细。于是…...

Web 开发 1: Flask 框架介绍和使用

在 Web 开发中&#xff0c;Flask 是一个流行且灵活的 Python Web 框架&#xff0c;用于构建 Web 应用程序。它简洁而易于上手&#xff0c;适用于小型到中型的项目。在本篇博客中&#xff0c;我将为你介绍 Flask 框架的基础知识和常用技巧&#xff0c;帮助你更好地掌握 Web 开发…...

Centos7.6之禅道开源版17.6.1安装记录

Centos7.6之禅道开源版17.6.1安装记录 文章目录 Centos7.6之禅道开源版17.6.1安装记录1. 下载2. 安装3. 登录4. 连接数据库1. 本地连接2. 远程连接1. 开启远程访问用户2. 更改mysql绑定的主机3. 重启Apache与MySQL服务 4. 常用命令1. Apache和Mysql常用命令2. 其他 1. 下载 官网…...

有趣的代码(简单)

1.代码1 #include<stdio.h> #include<string.h> #include<windows.h> #define _CRT_SECURE_NO_WARNINGS 1 void love() {system("color 4");printf(" **** ***************** ** …...

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求&#xff1a; 搜索栏展示当前登陆的个人用户的搜索历史记录&#xff0c;删除个人历史记录。用户在搜索栏输入某字符&#xff0c;则将该字符记录下来 以zset格式存储的redis中&#xff0c;记录该字符被搜索的个数以及当前的时间戳 &#xff08;用…...

超越传统,想修哪里就修哪里,SUPIR如何通过文本提示实现智能图像修复

项目简介 通过参数增加使得模型不仅能够修复图像中的错误或损坏&#xff0c;还能根据文本提示进行智能修复。例如根据描述来改变图像中的特定细节。这样的处理方式提升了图像修复的质量和智能度&#xff0c;使得模型能够更准确、更灵活地恢复和改进图像。 SUPIR的主要功能图像…...

《如何画好架构图》学习笔记

看了一堂《如何画好架构图》的公开课&#xff0c;结合网上的资料与经验做一些思考总结。文中的例子和图片大多是从课程中摘录的。 1. 4R架构定义 4R架构定义其实是软件架构定义经过归纳提炼后的简称。 软件架构定义&#xff1a;软件架构是指软件系统的顶层&#xff08;Rank&am…...

redis整合

一.redis的发布订阅 什么 是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 1、Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可以…...

开循环低温样品架节约液氦操作技巧

开循环低温样品架以降温快、无轰动源、重量轻、装置便利等特色遭到大多数客户的喜爱。但是制冷剂消耗量引起的运用本钱是客户在运用过程中zhong点重视的问题&#xff0c;特别是随着全球液氦价格继续飙升&#xff0c;开循环样品架的运用本钱也在逐渐添加&#xff0c;如何节约液氦…...

年薪30W+,待遇翻倍,我的经历值得每个测试人借鉴

从自考大专到出走公司&#xff0c;从半年无业露宿深圳北站&#xff0c;从8k…到11.5k…再到20k&#xff0c;我的经历值得每个测试人借鉴 或许学历并没有那么重要 12年高考之后&#xff0c;在朋友的介绍下&#xff08;骗了过去&#xff09;&#xff0c;没有好好的读大学&#x…...

DEB方式安装elastic search7以及使用

参考&#xff1a;https://www.cnblogs.com/anech/p/15957607.html 1、安装elastic search7 #手动下载安装 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.1-amd64.deb wget https://artifacts.elastic.co/downloads/elasticsearch/elastics…...

[Tomcat] [最全] 目录和文件详解

打开tomcat的解压之后的目录可以看到如下的目录结构&#xff1a; Bin bin目录主要是用来存放tomcat的命令&#xff0c;主要有两大类&#xff0c;一类是以.sh结尾的&#xff08;linux命令&#xff09;&#xff0c;另一类是以.bat结尾的&#xff08;windows命令&#xff09;。 …...

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…...

兼容树莓派扩展模块,专注工业产品开发的瑞米派强势来袭

近日&#xff0c;米尔电子和瑞萨电子共同定义和开发了瑞萨第一款MPU生态开发板——瑞米派&#xff08;Remi Pi&#xff09;正式上市了&#xff01;在各种Pi板卡琳琅满目的当下&#xff0c;Remi Pi是一款与众不同的开发板&#xff0c;他兼顾了严肃产品开发和爱好者创意实现两种需…...

云原生 - 微信小程序 COS 对象存储图片缓存强制更新解决方案

问题描述 遇到一个这样的情况&#xff1a;在微信小程序里图片缓存十分麻烦&#xff0c;网上很多说在腾讯云里的 COS 存储对象服务里设置对应的图片缓存&#xff08;Header 头 Cache-Contorl&#xff09;&#xff0c;说实话真不好用&#xff0c;一会儿生效&#xff0c;一会儿没…...

设计公司设计ppt的优势—南京梵构广告

在这个时代的发展下&#xff0c;PPT软件越来越好用&#xff0c;投影仪越来越便宜&#xff0c;直接导致许多商界人士不再撰写文件了。他们只是在编写演示文稿&#xff0c;这些文稿只是些没有细节、缺乏支持的概要。许多人不喜欢撰写详尽文件所付出的脑力劳动。 视觉效果 一个好…...

gitlab设置/修改克隆clone地址端口

最近由于公司要停测试库云服务器? 什么?要停测试库服务器??? 是的! 你没听错。 真是醉了,多大的集团,为了省钱,也真是拼了, 作为开发人员,没有测试服务器,犹如断臂之人。 所以,在之前搭建环境的时候都没有写文档,今天算是弥补上,以后都可以作为参考了, …...

Jellyfin影音服务本地部署并结合内网穿透实现公网访问本地资源

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…...

笨蛋学设计模式行为型模式-责任链模式【18】

行为型模式-责任链模式 8.5责任链模式:arrow_up::arrow_up::arrow_up:8.5.1概念8.5.2场景8.5.3优势 / 劣势8.5.4责任链模式可分为8.5.5责任链模式8.5.6实战8.5.6.1题目描述8.5.6.2输入描述8.5.6.3输出描述8.5.6.4代码 8.5.7总结 8.5责任链模式⬆️⬆️⬆️ 8.5.1概念 ​ 责任…...

【.NET Core】深入理解任务并行库 (TPL)

【.NET Core】深入理解任务并行库 (TPL) 文章目录 【.NET Core】深入理解任务并行库 (TPL)一、概述二、数据并行&#xff08;任务并行库&#xff09;三、Parallel.For 循环示例四、Parallel.ForEach 循环示例五、处理并行循环中的异常六、数据并行总结6.1 不要假定并行的速度始…...

win10安装redis并配置加自启动(采用官方推荐unix子系统)

记录&#xff0c;为啥有msi安装包&#xff0c;还这么麻烦的用linux版本redis的安装方式&#xff0c;是因为从github上下载别人制作的msi报毒&#xff0c;还不止一处&#xff0c;这种链接数据库的东西&#xff0c;用别人加工过的&#xff0c;都报毒了还用就是傻逼了。 所以采用…...

【大数据面试题】HBase面试题附答案

目录 1.介绍下HBase 2.HBase优缺点 3.介绍下的HBase的架构 4.HBase的读写缓存 5.在删除HBase中的一个数据的时候&#xff0c;它是立马就把数据删除掉了吗? 6.HBase中的二级索引 7.HBase的RegionServer宕机以后怎么恢复的? 8.HBase的一个region由哪些东西组成? 9.…...

SpringBoot中从HikariCP迁移到Oracle UCP指南

本博客文章的目标是作为从 HikariCP 和Oracle UCP&#xff08;通用连接池&#xff09;迁移的指南&#xff0c;因为它是连接到Oracle 数据库时的推荐方法。 HikariCP 简介 HikariCP是与 Spring Boot 应用程序一起使用的 JDBC 连接池。 简而言之&#xff0c;从 Java 开发人员的…...

wordpress 家教/中国网民博客 seo

学习&#xff1a;我和阿九Azure有约 系列视频教程&#xff08;油管可看&#xff09; 第一节&#xff1a;Subscription是什么&#xff1f; 建立Subscription 不用信用卡也不用电话。 我们还可以用下面方式 第二节&#xff1a;Resource Group 第三节&#xff1a;App Service 免…...

linux上安装wordpress/seo营销推广全程实例

代理设计模式&#xff1a; 动态代理举例&#xff1a; 接口&#xff1a; 被代理类&#xff1a; 测试&#xff1a;...

哪家网站建设公司靠谱/专业关键词优化平台

今天在看王爽的《汇编语言》&#xff0c;看到地址总线的时候&#xff0c;由于那个图画的是并行传输&#xff0c;于是我就去搜了下地址总线是不是并行总线&#xff0c;结果看到一篇文章说现在串行总线的传输速度比并行总线要快&#xff0c;我就奇怪了。 在我的印象中&#xff0c…...

自己做网站怎么做/竞价培训

文件上传是很常见的实用功能。本文演示如何用Express实现文件上传功能。例程本例需要两个文件及一个目录test39.js&#xff1a;主程序&#xff1b;index.html&#xff1a;用于上传文件的前端页面&#xff1b;temp_folder&#xff1a;存放被上传的文件。test39.js&#xff1a;va…...

做网站的主营业务/网络营销该如何发展

.m文件分为脚本文件和函数&#xff0c;其中函数可以接收参数和输出&#xff0c;脚本不可以 脚本中往往包含多个函数&#xff0c;是一系列命令行的集合 创建脚本文件需要使用文本编辑器&#xff0c;使用edit(文件名.m)打开文本编辑器 输入文件名即可运行脚本 mkdir创建文件夹…...

重庆潼南网站建设公司电话/企业管理培训机构

matlab程序设计例题及答案 1.编写程序&#xff1a;计算1/32/53/7……10/21 法一&#xff1a; s0; for i1:10 ssi/(2*i1); end s s 4.4096 法二&#xff1a; sum((1:10)./(3:2:21)) ans 4.4096 2.编写程序&#xff1a;计算1~100中即能被3整除&#xff0c;又能被7整除的所有数之…...