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

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

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

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

相关文章

Java 基于 SpringBoot+Vue 的社区团购系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Spring 事务原理一

从本篇博客开始&#xff0c;我们将梳理Spring事务相关的知识点。在开始前&#xff0c;想先给自己定一个目标&#xff1a;通过此次梳理要完全理解事务的基本概念及Spring实现事务的基本原理。为实现这个目标我想按以下几个步骤进行&#xff1a; 讲解事务中的一些基本概念使用Sp…

架构篇13:架构设计流程-详细方案设计

文章目录 架构设计第 4 步&#xff1a;详细方案设计详细方案设计实战小结 完成备选方案的设计和选择后&#xff0c;我们终于可以长出一口气&#xff0c;因为整个架构设计最难的一步已经完成了&#xff0c;但整体方案尚未完成&#xff0c;架构师还需继续努力。接下来我们需要再接…

java数据结构与算法刷题-----LeetCode645. 错误的集合(位运算解法需要重点掌握)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 法一&#xff1a;桶排序思想法二&#xff1a;位运算 法一&#x…

QGraphicsView前有QWidget遮罩,导致QGraphicsItem鼠标事件不响应

场景&#xff1a;在一个QWidget上放置了一个QGraphicsView用于显示图像&#xff0c;QGraphicsView设置了场景&#xff0c;并添加了一个自定义QGraphicsItem。由于需求原因&#xff0c;又绘制了一个标尺QWidget放在QGraphicsView前部。 结果导致标尺QWidget显示时&#xff0c;重…

初识进程(Linux)

进程 前言1. 介绍冯诺依曼体系结构①. CPU——寄存器、运算器、控制器和时钟②. 存储器——内存③. 输入输出设备④. 程序运行过程⑤. 小结 2. 操作系统①. 基本介绍②. 先描述再组织&#xff08;重要&#xff1a;贯穿Linux内核&#xff09; 进程1. 概念2. 了解进程①进程PCB②…

从 Vscode 中远程连接 WSL 服务器:可以本地操作虚拟机

从 Vscode 中远程连接 WSL 服务器&#xff1a;可以本地操作虚拟机 1.下载 Vscode Visual Studio Code - Code Editing. Redefined 2.搜索框中输入>wsl&#xff0c;点击 WSL&#xff1a;Connect to WSL using Distro... 3.点击下载好的Ubuntu&#xff0c;当左下角出现图片同…

工业相机与镜头参数及选型

文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离&#xff08;Worki…

计算机提示opencl.dll丢失怎么办?解决opencl.dll丢失的办法

OpenCL&#xff08;Open Computing Language&#xff09;是一个开放的、跨平台的并行计算框架&#xff0c;它允许开发者使用统一的编程模型来编写程序&#xff0c;以实现在各种硬件平台上的高性能计算。OpenCL.dll是OpenCL运行时库的一部分&#xff0c;它包含了许多用于执行Ope…

SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)

目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的&#xff1f; 1.2.1、Nacos的分级存储模型&#xff08;理论层&#xff09; 1.2.2、Nacos 源码启动&#xff08;准备工作&#xff09; 1.2.…

代码随想录算法训练营第十三天 |239.滑动窗口最大值,347.前k个高频元素(待补充)

239.滑动窗口最大值 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、视频讲解&#xff1a; 单调队列正式登场&#xff01;| LeetCode&#xff1a;239. 滑动窗口最大值_哔哩哔哩_bili…

archlinux安装软件

用 pacman 安装 sudo pacman -S XXXX xxx 中填写要安装的软件就可以了 搜索的命令是 pacman -Ss 搜索的话不需要管理员权限 查看已经安装的程序 pacman -Q 可以通过 | 将前面的信息传给后面&#xff0c;相当于传参 pacman -Q | grep XXXX 删除软件 sudo pacman -Rs…