精讲:结构体

大家好:

        衷心希望各位点赞。

        您的问题请留在评论区,我会及时回答。

一、结构体

        C语言中,结构体是用户根据实际问题而自行建立的一种数据类型,是由一系列相同或不同数据类型的数据构成的集合。在实际问题中,一个对象往往具有多个属性,需要一组不同类型的数据来表示。比如:手机通讯录中的一条记录应该包括编号、姓名、电话号码、性别、生日、地址等信息。显然单个基本数据类型或数组不能表达一条通讯记录,这时就需要用到结构体类型。结构体类型同C语言的基本数据类型一样,可以赋值、作为函数的参数、作为函数的返回值。

1、结构体定义

         结构体是由一个或多个变量组成的集合。这些变量称为结构成员,结构成员可以是相同类型,也可以是不同类型。结构体定义形式如下:

struct 结构体名
{数据类型 成员名;数据类型 成员名;数据类型 成员名;...
};

        结构体名是定义结构体数据类型的名字,在“{”和“}”之间的是结构体成员的列表,每一个结构体成员由一个数据类型和合法标识符组成。

        在程序中定义结构体时,需要注意结构体成员可以是另外一个结构体类型,比如:

struct Date
{int year;int month;int day;
};struct Person
{string name;struct Date birthday;
};

2、结构体使用

通过结构体创建变量的方式有三种:

struct 结构体名 变量名;
struct 结构体名 变量名 = { 成员1值, 成员2值...};
定义结构体时,顺便创建变量。
#include <iostream>
#include <Windows.h>
#include <string>using namespace std;//创建学生数据类型:结构成员包括姓名、年龄、分数
//struct关键字不可省略
struct Student 
{//成员列表string name;//姓名int age;//年龄int score;//分数
}s3;//定义结构体时,顺便创建结构体变量int main(void) {//1、struct 结构体名 变量名;struct Student s1;//给s1的属性赋值s1.name = "张三";s1.age = 18;s1.score = 100;cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;//2、struct 结构体名 变量名 = { 成员1值, 成员2值... };struct Student s2 = { "李四", 17, 90 };cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;//3、定义结构体时,顺便创建结构体变量s3.name = "王五";s3.age = 16;s3.score = 80;cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;system("pause");return 0;
}

运行截图:

二、结构体数组

        结构体数组是具有相同结构体类型的变量的集合,可以用于存储和处理一批相同结构体类型的数据。结构体数组的每一个元素都是结构体类型数据,每一个元素都包括含该结构体类型的所有成员。

#include <iostream>
#include <Windows.h>
#include <string>using namespace std;struct Student 
{//成员列表string name;//姓名int age;//年龄int score;//分数	
};
int main(void) {//创建结构体数组struct Student stuArray[3];stuArray[0] = { "张三", 18, 100 };stuArray[1] = { "李四", 17, 90 };stuArray[2] = { "王五", 16, 80 };for (int i = 0; i < 3; i++) {cout << "姓名:" << stuArray[i].name << " 年龄:" << stuArray[i].age << " 分数:" << stuArray[i].score << endl;}cout << "----------" << endl;//创建结构体数组,同时赋初值struct Student stuArray1[3] = {{ "小明", 8, 100 },{ "小军", 7, 90 },{ "小红", 6, 80 }};for (int i = 0; i < 3; i++) {cout << "姓名:" << stuArray1[i].name << " 年龄:" << stuArray1[i].age << " 分数:" << stuArray1[i].score << endl;}system("pause");return 0;
}

运行截图:

三、结构体指针

        作用:通过指针访问结构体中的成员,利用指向运算符‘ -> ’可以通过结构体指针访问结构体成员。

#include <iostream>
#include <Windows.h>
#include <string>using namespace std;struct Student 
{//成员列表string name;//姓名int age;//年龄int score;//分数	
};
int main(void) {//创建结构体变量,并初始化struct Student stu = { "张三", 18, 100 };//创建结构体指针,并指向结构体变量struct Student* p = &stu;//结构体指针通过‘ -> ’访问成员cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;system("pause");return 0;
}

运行截图:

 

四、结构体嵌套结构体

        定义:结构体中的成员可以是另外一个结构体。

        比如:每一个老师辅导一个学生,一个老师结构体中,记录一个学生结构体。

#include <iostream>
#include <Windows.h>
#include <string>using namespace std;struct Student 
{//成员列表string name;//姓名int age;//年龄int score;//分数	
};struct Teacher 
{int id; //教师编号string name;int age;struct Student stu; //辅导的学生
};int main(void) {struct Teacher t1;t1.id = 1000;t1.name = "李老师";t1.age = 40;t1.stu.name = "张三";t1.stu.age = 18;t1.stu.score = 100;cout << "教师 职工编号:" << t1.id << " 姓名:" << t1.name << " 年龄:" << t1.age << endl;cout << "学生 姓名:" << t1.stu.name<< " 年龄:" << t1.stu.age<< " 分数:" << t1.stu.score << endl;system("pause");return 0;
}

运行截图:

 

五、结构体作函数参数

        像其他普通类型一样,结构体类型也可以作为函数的参数类型和函数的返回值类型,用结构体变量作为函数实参,与普通变量作为函数实参没有区别,都是传值调用。在函数内部对其操作,不会引起结构体各个成员值的变化。

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

        传递方式有两种:值传递、地址传递

六、结构体中const使用场景

七、结构体案例

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

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

相关文章

安卓性能优化面试题 35-40

36. 简述Android卡顿优化 ?经过综合搜索结果和上面的讨论,对于Android卡顿优化的总结如下: 1. 卡顿问题的原因:卡顿问题可能由UI线程阻塞、CPU密集计算、内存泄漏等多种因素引起。 2. 卡顿检测与定位:采用线上线下监控方案、工具和日志分析,帮助发现和定位卡顿问题的具体…

node.js安装、npm镜像、vue cli脚手架安装

node.js、npm、vue/cli 文章目录 一、node.js安装二、包路径管理2.1 查看npm下载的默认路径2.2 更改路径2.3 配置环境变量2.4 安装cnmp&#xff08;npm镜像) 三、安装脚手架创建Vue项目3.1 安装脚手架3.2 创建项目 一、node.js安装 官网上下载&#xff0c;然后直接一路下一步 …

2024年华为OD机试真题-贪心歌手-Java-OD统一考试(C卷)

题目描述: 一个歌手准备从A城去B城参加演出。 1) 按照合同,他必须在T天内赶到。 3) 歌手不能往回走。 4) 每两座城市之间需要的天数都可以提前获知。 5) 歌手在每座城市都可以在路边卖唱赚钱。经过调…

TC551001CPI

TC551001CPI/CFI/CFTI/CTRI/CSTI/CSRI是东芝&#xff08;Toshiba&#xff09;公司生产的一款131,072字8位的静态随机存取存储器&#xff08;SRAM&#xff09;。以下是对该芯片的详细解读&#xff1a; 描述 存储容量&#xff1a;1,048,576位&#xff0c;即128Kb&#xff08;13…

k8s为什么删除了pod但是还是没删除掉的问题,deployment在影响

deployment 影响pod删除 一、问题所在二、解决问题 一、问题所在 执行&#xff1a;kubectl get pods --all-namespaces&#xff0c;获取dashboard相关的pod kubectl get pods --all-namespaces | grep dashboardkubectl delete pod dashboard-metrics-scraper-546d6779cb-4x6…

解密Oracle数据库引擎:揭开数据存储的神秘面纱(二)

本系列文章简介&#xff1a; 本系列文章旨在揭开Oracle数据库引擎的神秘面纱&#xff0c;帮助大家深入了解其内部机制和工作原理。我们将从基础概念入手&#xff0c;逐步深入到数据库引擎的核心组件和技术细节。我们将探讨Oracle数据库引擎的存储结构、索引机制、事务处理、并发…

Mysql设计规范

主键推荐默认用递增字符串大小合理设置数据库默认字段: 主键、创建人、创建时间、修改人、修改时间、逻辑删除&#xff08;可选&#xff09;、乐观锁&#xff08;可选&#xff09;冗余字段&#xff1a; 严禁冗余变更字段&#xff1b;例如&#xff1a; 创建人名称&#xff0c;租…

【Linux Day16 I/O复用】

I/O复用 用途&#xff1a;I/O 复用能同时监听多个文件描述符。 I/O 复用虽然能同时监听多个文件描述符&#xff0c;但它本身是阻塞的。并且当多个文件描述符同时就绪时&#xff0c;如果不采取额外的措施&#xff0c;程序就只能按顺序依处理其中的每一个文件描述符&#xff0c;…

如何使用“ubuntu移动文件、复制文件到其他文件夹“?

一、移动文件到其他文件夹命令 mv node_exporter-1.5.0.linux-amd64.tar.gz /usr/local/etc/prometheus 二、复制文件到其他文件夹命令 cp node_exporter-1.5.0.linux-amd64.tar.gz /home/master

java每日一题——幸运囚犯(合集遍历,查询数据练习)

前言&#xff1a; 合集基本学完了&#xff0c;做做题巩固下知识点。打好基础&#xff0c;daydayup! 题目如下&#xff1a; 目前有100名囚犯&#xff0c;每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号&#xff08;要求这些囚犯的编号是不能重复的&a…

CSS字体图标

文章目录 1. 概念2. 阿里图标 iconfont2.1. 网址2.2. 使用方法2.3. 注意事项2.3.1. 原因 3. font-awesome 图标3.1. 网址3.2. 使用方法 1. 概念 本质就是一个字体&#xff0c;可以灵活修改它的样式&#xff0c;降低服务器请求的次数&#xff0c;同时相比图片更加清晰。 2. 阿…

expect语法

样式匹配 *号 1 2 expect "hi*" send "$expect_out(0,string) $expect_out(buffer)" 输入philosophic,输出为hilosophic philosophic,hi*匹配的是hilosophic 如果是hi*hi,则匹配的是hilosophi 如果是*hi*,则匹配的是philosop hi c\n ,而不是p hi losop…

全屏解决方案 (screenfull or vueuse)

ScreenFull 使用 (方案一) 参考文章朝阳 39 参考文章半夏_2021 安装 npm install screenfull --save (默认是 6.0,vue2 环境下会报错,所以需要安装 5.1.0) vue2 安装 npm i screenfull5.1.0 引入 import screenfull from “screenfull”; 调用 // 属性 screenfull.isFullscree…

【Web APIs】DOM获取元素

目录 1.Web API基本认识 2.获取DOM元素 3.设置/修改DOM元素内容 4.设置/修改DOM元素属性 4.1修改元素常用属性 4.2修改元素样式属性 4.3设置/修改表单属性 5.定时器-间歇函数 1.Web API基本认识 作用&#xff1a;就是使用js去操作html和浏览器 分类&#xff1a;DOM&am…

给wordpress添加自定义字段的分类筛选功能

要为WordPress添加自定义字段的筛选功能&#xff0c;你需要使用WordPress的查询参数(query parameters)和WP_Query类来构建自定义查询。以下是一个详细的示例代码&#xff0c;展示了如何添加自定义字段的筛选功能。 首先&#xff0c;你需要在你的主题或插件的functions.php文件…

windows访问远程服务器上容器的几种直接方式

远程服务器 host上有一个docker container&#xff0c;如何通过 client 直接登陆 container 呢&#xff1f; container 使用 host 的网络&#xff0c;即使用了 --networkhost先配置 container的 ssdh&#xff08;/etc/ssh/sshd_config&#xff09;&#xff0c;相关参数设置 po…

经典过河问题

Safe Passage 题目链接 首先我们想&#xff0c;应该让最快与次快的先过河&#xff0c;然后让他俩来回的带其他人过河 两种考虑方式其实差不多&#xff0c; 一&#xff1a;以右岸为基准 这时我们想&#xff0c;当最快与次快的过河后&#xff0c;我们由两种选择&#xff1a; …

更高效的反射调用方式被我找到了!

背景 在使用Java进行开发时&#xff0c;我们会不可避免的使用到大量的反射操作&#xff0c;比如Spring Boot会在接收到HTTP请求时&#xff0c;利用反射Controller调用接口中的对应方法&#xff0c;或是Jackson框架使用反射来解析json中的数据给对应字段进行赋值&#xff0c;我…

C#进阶-用于Excel处理的程序集

在.NET开发中&#xff0c;处理Excel文件是一项常见的任务&#xff0c;而有一些优秀的Excel处理包可以帮助开发人员轻松地进行Excel文件的读写、操作和生成。本文介绍了NPOI、EPPlus和Spire.XLS这三个常用的.NET Excel处理包&#xff0c;分别详细介绍了它们的特点、示例代码以及…

【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关)

&#x1f6eb; 系列文章导航 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580【Frida】 01_食用指南 https://blog.csdn.net/kinghzking/article/details/126849567【Frida】 03_初识frida-node https://blog.csdn.net/kinghzking/ar…