C++——结构体

news2024/12/28 8:22:19

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

作用:用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临时代替量接收被替换的全部内容。

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

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

相关文章

函数递归(Recursion)一篇便懂

递归的概念 在 C 语言中&#xff0c;递归&#xff08;Recursion&#xff09;是一种函数调用自身的编程技术。当一个函数在其定义中调用自身时&#xff0c;就称为递归函数。 了解递归思想 把⼀个大型复杂问题层层转化为⼀个与原问题相似&#xff0c;但规模较小的子问题来求解…

安卓开发之自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局&#xff1a; 我们只需要替换根布局所需的自动缩放&#xff0c;子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout&#xff08;框架布局&#xff…

k8s部署Ingress

前提&#xff1a;有自备的域名&#xff0c;没有域名可用主机配置的域名解析代替测试 #主机配置的域名 vi /etc/hosts #追加以下内容 127.0.0.1 kuboard1、部署Ingress vi deploy.yaml #输入以下内容apiVersion: v1 kind: Namespace metadata:labels:app.kubernetes.io/instan…

基于springboot+vue的网上租赁系统(前后端分离)

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

33岁前端干了8年,是继续做前端开发,还是转其他工作?

真心不建议在前端开发上终老&#xff0c;相信大家也发现了问题&#xff1a;前端的内容就那些&#xff0c;不管怎么搞都搞不过年轻人。 这个时候就要赶紧想办法为下一个十年做打算了&#xff0c;若是继续在前端开发岗上&#xff0c;过不了几年&#xff0c;要么会被边缘化&#…

微信小程序开发创建component组件,报错WXML file not found解决方案

报错如下&#xff1a; 解决方案&#xff1a; 在组件.json文件加上"styleIsolation": "apply-shared",&#xff1a;

【血泪】dell_smm_hwmon: unable to get SMM Dell signature-黑屏无法进入Ubuntu系统 - 问题解决

【问题描述】 昨天下午装了Ubuntu20.04系统&#xff0c;晚上装显卡驱动的时候&#xff0c;重启一下&#xff0c;直接黑屏了。如下图&#xff0c;一直卡着进不去。 于是反思&#xff0c;想起来每一次都是执行到&#xff1a;禁用nouveau 的这一步&#xff0c;之后就不能启动了。…

【Linux】常见指令(二)

前言 常见指令第二部分。 文章目录 一、指令&#xff08;下&#xff09;重定向>&#xff1a;输出重定向>>&#xff1a;追加输出<&#xff1a;输入重定向 10. more—显示文本文件内容11.less—逐屏浏览文本文件内容12. head13. tail管道 |14. date—时间指令在这里插…

C++ day 1

思维导图 使用C编写一个程序&#xff0c;输入一个字符串&#xff0c;统计大小写字母、数字、空格和其他符号的个数 #include <iostream>using namespace std;int main() {int capital 0;int lower 0;int digit 0;int spaces 0;int others 0;cout << "请…

【JavaEE进阶】 MyBatis使用XML实现增删改查

文章目录 &#x1f38d;前言&#x1f340;配置连接字符串和MyBatis&#x1f343;写持久层代码&#x1f6a9;添加mapper接⼝&#x1f6a9;添加UserInfoXMLMapper.xml&#x1f6a9;单元测试 &#x1f334;增(Insert&#xff09;&#x1f6a9;返回⾃增id &#x1f38b;删(Delete)&…

图书管理系统-Python

相关代码&#xff1a; # Time: 2024/1/23 16:16 # Author: 马龙强 # File: 图书管理系统.py # software: PyCharm class Book():def __init__(self,name,auther,status,bookindex):self.name nameself.auther autherself.status statusself.bookindex bookindexdef __str…

AI-数学-高中-8-函数奇偶性

原作者视频&#xff1a;函数】6函数奇偶性&#xff08;易-中档&#xff09;_哔哩哔哩_bilibili 示例&#xff1a; 已知奇偶性求解析式&#xff1a; 奇偶、单调函数综合示例&#xff1a;

【C++】c++入门,认识c++版本的Hello world!

Hello,everybody!在c语言&#xff0c;数据结构初阶学完之后&#xff0c;咱们就要开始c的学习了。关于c的语法&#xff0c;有很多是为了弥补c语言的不足。在咱们学习c的过程中&#xff0c;随着你对c语法掌握的越来越熟练。我相信你会逐渐爱上c。那我们直接进入正题。 1.c兼容c …

Beego之Beego MVC架构介绍

1、beego MVC架构介绍 beego 是一个典型的 MVC 框架&#xff0c;它的整个执行逻辑如下图所示&#xff1a; 通过文字来描述如下&#xff1a; 1、在监听的端口接收数据&#xff0c;默认监听在 8080 端口。 2、用户请求到达 8080 端口之后进入 beego 的处理逻辑。 3、初始化 C…

VS Code + Python + Selenium 自动化测试基础

五星上将麦克阿瑟曾经说过“不会写自动化测试&#xff0c;不是好开发“ 一、让我们来讲一个故事 今天和女朋友吵架了&#xff0c;&#xff08;假设你有女朋友&#xff09;。 今晚又是一个人睡沙发&#xff0c;这天晚上&#xff0c;你躺在沙发上&#xff0c;夜不能寐 因为&a…

openai assistants api接入微信机器人,实现类GPTs功能

chatgpt网址:https://chat.xutongbao.top 比普通gpt多了代码解释器功能&#xff0c;和上传训练数据文件的功能&#xff0c;这两个功能就是GPTs拥有的&#xff0c;而普通gpt没有拥有的

IaC基础设施即代码:Terraform 连接 tencentcloud COS 实现多资源管理

目录 一、实验 1.环境 2.Terraform 连接 tencentcloud 腾讯云COS 3.申请VPC专有网络资源 4.申请安全组资源 5.申请CVM资源 6.申请CLB资源 7.申请DNS资源 8.销毁资源 二、问题 1. Terraform申请安全组资源失败 2.Terraform验证云主机资源报错 3. A记录和CNAME的区别 …

RabbitMQ系列之入门级

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ系列之入门级》。&#x1f3af;&#x…

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

Universal Approximation Capabilities of Mixture of Weibulls (混合韦布尔分布的万能近似)

找了好久都没有找到混合韦布尔分布是否有万能近似性质&#xff0c;下面这个算是一点线索&#xff0c;不过看不太懂。 回答1&#xff1a;Ultimately this sounds tautological: just define “well-behaved” as any density that can be approximated, according to some speci…