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 s1
	Student 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使用场景

8,结构体案例

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

#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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java前端——HTTP协议中get和post的区别

get 和 post是 HTTP 请求的两种方法 应用场景&#xff1a; 一般 get 请求用于对服务器资源不会产生影响的场景&#xff0c;如请求一个网页的资源 post 请求一般用于对服务器资源会产生影响的情景&#xff0c;如注册用户这一类的操作。 get请求一般用于向服务器请求数据&…

Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索

作者&#xff1a;来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9&#xff08;有史以来最快的 Lucene 版本&#xff09;之上&#xff0c;基于我们对标量量化和搜索并发性的贡献&#xff0c;为文本、向量和…

Bert详解

Bert框架 基本架构Embeddingpre-trainingMLM&#xff08;Mask Language Model&#xff09;NSP&#xff08;Next Sentence Prediction&#xff09; fine-tuning优缺点 基本架构 由Transformer的Encoder层堆叠而来 每个部分组成如下&#xff1a; Embedding Embedding由三种E…

最小生成树(Java实现)

一、Prim算法 Prim算法基本思想为&#xff1a;从联通网络 N{V,E}中某一顶点 v0 出发&#xff0c;此后就从一个顶点在 S 集中&#xff0c; 另一个顶点不在 S 集中的所有顶点中选择出权值最小的边&#xff0c;把对应顶点加入到 S 集 中&#xff0c; 直到所有的顶点都加入到 S 集中…

D-Tale SSRF漏洞复现(CVE-2024-21642)

0x01 产品简介 D-tale 是一个在 2020 年 2 月推出的库, 是 Pandas 数据结构的可视化工具。它具有许多功能,对于探索性数据分析非常方便、支持交互式绘图、3d 绘图、热图、特征之间的相关性、构建自定义列等等。 0x02 漏洞概述 D-Tale 是 Pandas 数据结构的可视化工具。3.9…

swift基础语法

swift学习笔记 参考教程 https://www.runoob.com/swift/swift-data-types.html swift代码规范 https://juejin.cn/post/7129465308376465422 1 环境搭建 必须要有苹果电脑且安装Xcode 2 基本语法 Swift是类型安全的语言&#xff0c;编译时会进行类型检查 import Cocoa var m…

Git学习笔记(第7章):IDEA实现Git操作(VSCode)

目录 7.1 配置忽略文件 7.2 初始化本地库 7.3 添加暂存区、提交本地库 7.4 修改文件 补充&#xff1a;工具栏简介 7.1 配置忽略文件 问题引入 在版本控制系统中&#xff0c;有些文件或目录是不需要纳入版本管理的&#xff0c;比如编译产生的临时文件、日志文件、缓存文件等…

基于springboot+vue的网上购物商城(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

hugo的常规使用操作

hugo的常规使用操作&#xff08;不断完善中&#xff09; 找到theme主题中config.toml 一般都会通过theme中复制到自己项目的config.toml中做修改和补充&#xff0c;来完善不同的业务需求 Hugo静态资源载入逻辑 原理 将图片信息放到static中&#xff0c;但是在文章中写的时…

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案

2018年&#xff0c;我们开始在原生RTSP|RTMP直播播放器的基础上&#xff0c;对接了Unity环境下的低延迟播放&#xff0c;毫秒级延迟&#xff0c;发布后&#xff0c;就得到了业内一致的认可。然后我们覆盖了Windows、Android、iOS、Linux的RTMP推送、轻量级RTSP服务和RTSP|RTMP播…

《WebKit 技术内幕》学习之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程&#xff1a;首先检测事件发生处的元素有无监听者&#xff0c;如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件&#xff08;浏览器对于有些事件必须响应…

BGP Local-preferenct 、AS-Path、 Origin 综合选路实验

Local-preference&#xff1a; 本地优先级&#xff0c;公认任意&#xff0c;仅能在 AS 内使用&#xff08;IBGP内传递&#xff09;&#xff0c;不能在EBGP传递&#xff0c;默认值 100&#xff0c;越大越优。用于离开本 AS &#xff0c;在 IBGP 的入、出方向都可使用&#xff0c…

双端Diff算法

双端Diff算法 双端Diff算法指的是&#xff0c;在新旧两组子节点的四个端点之间分别进行比较&#xff0c;并试图找到可复用的节点。相比简单Diff算法&#xff0c;双端Diff算法的优势在于&#xff0c;对于同样的更新场景&#xff0c;执行的DOM移动操作次数更少。 简单 Diff 算法…

光学期刊1

光学领域的你&#xff0c;如何评价最近发布的光学期刊分区&#xff1f; 如题&#xff0c;附分区表 20240122 知乎 同样先写结论&#xff1a;时代变了&#xff0c;发国产没错的。参考light当年开局多艰难&#xff0c;被各种diss口碑差&#xff0c;很多投一区守门员不中的也…

二进制部署高可用k8s集群V1.20.11版本

文章目录 一、操作系统初始化配置&#xff08;所有节点均执行&#xff09;1、关闭防火墙2、关闭selinux3、关闭swap4、根据规划修改主机名5、在master节点上添加host6、将桥接的IPv4流量传递到iptables的链7、时间同步 二、部署Etcd集群1、准备cfssl证书生成工具2、生成Etcd证书…

2024年软件测试面试题大全【含答案】

Part1 1、你的测试职业发展是什么&#xff1f;【文末有面试文档免费领取】 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做…

tableau mysql 驱动安装

最便捷&#xff0c;最快速的方式。 整体流程&#xff1a;首先得知道你电脑mysql的版本&#xff0c;然后去官网下载ODBC驱动。 mysql版本&#xff1a;浏览器搜一些。 高版本驱动应该是兼容低版本的。 ODBC驱动&#xff1a; 选择第一个&#xff0c;下载&#xff0c;直接msi安装…

学习笔记之 机器学习之预测雾霾

文章目录 Encoder-DecoderSeq2Seq (序列到序列&#xff09; Encoder-Decoder 基础的Encoder-Decoder是存在很多弊端的&#xff0c;最大的问题就是信息丢失。Encoder将输入编码为固定大小的向量的过程实际上是一个“信息有损的压缩过程”&#xff0c;如果信息量越大&#xff0c;…

POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场

POKT Network&#xff08;又称 Pocket Network&#xff09;是一个去中心化的物理基础设施网络&#xff08;DePIN&#xff09;&#xff0c;它能够协调并激励对任何开放数据源的访问&#xff0c;最初专注于向应用程序和服务提供商提供区块链数据。 自 2020 年主网上线以来&#x…