c语言结构体学习

文章目录

  • 前言
  • 一、结构体的声明
    • 1,什么叫结构体?
    • 2,结构体的类型
    • 3,结构体变量的创建和初始化
    • 4,结构体的类型
    • 5,结构体的初始化
  • 二、结构体的访问
    • 1,结构体成员的点操作符访问
    • 2,结构体体成员的指针访问
  • 三、结构体传参


前言

昨天就是新的一年,小编看到了一句话送给各位读者:在过去的一年里,也许你踏足山巅,拥有团花锦簇的风光,也许你进入了低谷,经历了一个人的兵荒马乱,但是没关系的,去年千般未如愿,今年万事定称心。把过去的事儿,过去的人,一块尘封在记忆中不再烦恼,不再怀念。岁月本无语,未来犹可期,我始终如少年,你始终如初见。新的一年,我们看到了盛世的烟火,看到了繁华的街景,在c语言中写出烟花的代码可不是一个简单的小事情,他需要不断的积累,接下来我们学习结构体,在后面小编会给大家讲一些小的c游戏,烟花就需要用到结构体哦!


提示:以下是本篇文章正文内容,下面案例可供参考

一、结构体的声明

1,什么叫结构体?

结构就是一种集合
1,在之前我们学过很多数据类型,但是这些类型是内置类型,能描述的对象是非常有限的
2,但是生活中存在许多复杂对象,复杂对象就是不能用单一的数据去描述的,这时候为了方便描述复杂对象,于是c语言就有了结构体的概念
3,相比于结构体,数组是一组相同类型元素的集合,而结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同的类型

分析

就比如:我们划分一个人的特征
首先是性别,性别为男/女 ,我们存储这个性别用的类型为字符类型
再次是年龄,年龄肯定是正整数,我们定义一个有符号类型的整数来给年龄
然后是身高,身高是一个有小数点的数,所以我们这里可以用浮点型来定义身高
还有很多,在这里我们把人的特征集合在一起这个就是结构,然后这些特征被称为成员变量,每个成员
的变量类型可以相同可以不同

2,结构体的类型

语法形式

struct tag         
{member-list ;      
}  variable-list;  

例如:

//人的结构体类型声明
struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char   sex[5];   //性别
}p1,p2;
int main()
{return 0;
}
分析

在这里tag就是结构体的标签,也就是要描述的东西,也就是复杂对象像上面的例子中的人;member-list是成员列表,在这里面声明成员类型,也就是定义变量,如上方例子中的年龄,性别,身高等;variable-list变量列表,就是我们用上面这个类型来创建变量,这里肯定会有疑惑的,比如int x = 0;这后面是不是有一个分号,然后我们不初始化就是int x;所以简单的来说:也就是说前面的内容都是结构体的类型,然后我们o就是结构体类型的变量。在上面代码中我们创建了两个结构体变量p1和p2.在这里p1和p2是全局变量。而我们在定义变量的时候要尽量用局部变量所以我们需要继续往后学习结构体的变量的创建

3,结构体变量的创建和初始化

在上面我们是在main函数外面声明的全局变量,接下来我们学习结构体的变量创建

struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char sex[5];   //性别
};
int main()
{struct people p1 = { 0 };//结构体的局部变量return 0;
}
}
分析
在这里我们要区分一下结构体的类型是什么,结构体变量是什么,然后在上面你想给变量进行初始化就给他按照上面顺序类型给他赋值,用逗号隔开,不想初始化值,就局部初始全为0;注意这里和数组差不多一样的里面的成员很多,用大括号括起来。

在这里插入图片描述

4,结构体的类型

结构体的成员可以是标量,数组,指针,甚至可以是其他结构体

struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char sex[5];   //性别
};
struct team
{struct people p;int num;int class;
};
int main()
{struct people p1 = { 0 };//结构体的局部变量return 0;
}
分析

在这里我们又创建了一个小组成员的结构体变量,在结构体变量里面我们定义了结构体people类型的变{}量p1,数量,和组别。这里是结构体内使用其他结构体。

5,结构体的初始化

struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char sex[5];   //性别
};
struct team
{struct people p;int num;char class[5];
};
int main()
{//struct people p1 = { 0 };//结构体的局部变量struct people p1 = { "张三",20,175,"男" };struct team t = { {"张三",20,175,"男"} ,1,"经理" };return 0;
}

在这里插入图片描述

分析
然后在上面你想给变量进行初始化就给他按照上面顺序一一对应类别给他赋值,用逗号隔开,不想初始化值,就局部初始全为0;注意这里和数组差不多一样的里面的成员很多,用大括号括起来。然后结构体嵌套就在里面在加一个大括号描述另一个结构体内的成员就可以。如上方代码。打开监视窗口我们也可以发现它里面的存储情况和我们想的是一样的。如果不是一一对应的话他所赋值给的值不能给到相应的元素。然后出现下面这种情况。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/042756740f48458c9a9d9b3a8ff7a760.png)

二、结构体的访问

1,结构体成员的点操作符访问

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,结构体变量.结构体成员

     <table><tr><td bgcolor=turquoise>分析  </td></tr></table>

在上面我们只是通过监视窗口来查看结构体内的成员,我们可以将他打印出来么接下来就要用到结构体的访问,也就是我们之前学习的操作符内的结构体操作符,结构体操作符详见小编所写的详解c语言操作符(下篇)

struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char sex[5];   //性别
};
struct team
{struct people p;int num;char class[5];
};
int main()
{//struct people p1 = { 0 };//结构体的局部变量struct people p1 = { "张三",20,175,"男" };struct team t = { {"张三",20,175,"男"} ,1,"经理" };printf("%s %d %d %s\n",p1.name,p1.age,p1.height,p1.sex);printf("%s %d %d %s %d %s", t.p.name, t.p.age, t.p.height, t.p.sex,t.num,t.class);return 0;
}

在这里插入图片描述

分析

在这里,成员是内置类型不是指针,所以我们用变量名点成员来访问成员元素。

2,结构体体成员的指针访问

struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char sex[5];   //性别
};
struct team
{struct people p;int num;char class[5];
};
void print(struct people* p)
{printf("%s %d %d %s\n", p->name, p->age, p->height, p->sex);
}
int main()
{//struct people p1 = { 0 };//结构体的局部变量struct people p1 = { "张三",20,175,"男" };struct team t = { {"张三",20,175,"男"} ,1,"经理" };//printf("%s %d %d %s\n",p1.name,p1.age,p1.height,p1.sex);//printf("%s %d %d %s %d %s", t.p.name, t.p.age, t.p.height, t.p.sex,t.num,t.class);print(&p1);return 0;
}

在这里插入图片描述

分析
在这里我们把之前的打印注释掉,然后我们创建一个print函数来打印结构体变量p1,在这里我们对他进行取地址,然后接受的就是结构体指针变量,在print函数里面打印结构体变量p1的成员,这时候的变量p是指针变量,我们就不能用点操作符来访问结构体成员了我们得用箭头操作符来访问找到指针结构体成员。如上面代码所示,我们运行后还是正确的结果。

三、结构体传参

结构体传参其实我们在上面结构体的访问中就已经详细的说了,但是刚才是举例说明结构体的两种访问形式,显而易见,结构体传参也有两种传参形式,一种是直接将结构体变量本身传参,另一种则是传结构体的地址。

struct people
{char name[20]; //名字int age;       //年龄int height;    //身高char sex[5];   //性别
};
struct team
{struct people p;int num;char class[5];
};
void print1(struct people p)
{printf("%s %d %d %s\n", p.name, p.age, p.height, p.sex);  //结构体变量.成员变量
}
void print(struct people* p)
{printf("%s %d %d %s\n", p->name, p->age, p->height, p->sex);  //结构体指针 -> 成员变量
}
int main()
{//struct people p1 = { 0 };//结构体的局部变量struct people p1 = { "张三",20,175,"男" };struct team t = { {"张三",20,175,"男"} ,1,"经理" };printf("%s %d %d %s\n",p1.name,p1.age,p1.height,p1.sex);  printf("%s %d %d %s %d %s\n", t.p.name, t.p.age, t.p.height, t.p.sex,t.num,t.class);print1(p1);print(&p1);return 0;
}
分析

在这里print1中传参传递的就是结构体变量本身,print则是转递的是结构体的指针,将结构体变量的地址取出来传给print函数。在这里我们想让print1和print都打印p1的数据,而我们两个传参方式都做到了,达到了同样的效果,在这里我们看到p1如下图:在这里p1传参给p,也就是实参传参给形参,在之前函数的时候小编就说了,当实参传给形参时,形参就是实参的一份临时拷贝,所以我们在打印p的时候就是在打印p1的数据,但是,结构体传参把对象进行传参,是不是先拷贝在给他,如果结构体内成员多,这时候浪费的时间就多,在者进行对象传参,如果结构体成员多,那么我们需要开辟的空间也就越多,造成了空间浪费。
在这里插入图片描述

而在这里我们把p1的地址传过去,而指针大小无非就是四个字节或者八个字节,相对于把对象传参不用花费太多时间占用太大内存,而我们形参接受指针地址,后面也可以直接通过地址找到p1中的对象。
在这里插入图片描述

结论
函数传参的时候,参数需要压栈,如果传递一个结构体对象的时候结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。**因此,在结构体传参的时候,我们建议用指针传参的方式进行传参。**

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

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

相关文章

rime中州韵小狼毫 inputShow lua Filter 输入字符透传滤镜

在 rime中州韵小狼毫 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了…

基于ssm+vue服装商城购物系统

摘要 在基于SSM框架和Vue.js的服装商城购物系统中&#xff0c;整合了多种先进的技术&#xff0c;为电子商务领域的发展提供了有力支持。该系统不仅仅是技术层面的整合&#xff0c;更是对于业务流程和用户体验的深入考虑。以下是对该系统扩展的一些关键方面的讨论&#xff0c;以…

synchronized锁

synchronized 类锁&#xff1a;给类的静态方法加上synchronized 关键字进行修饰&#xff0c; 锁的是当前类class&#xff0c;一个静态同步方法拿到锁&#xff0c;其他静态同步方法就会等待静态同步方法和普通同步方法间是没有竞争的 对象锁&#xff1a;给类的方法加上synchron…

elasticsearch如何操作索引库里面的文档

上节介绍了索引库的CRUD&#xff0c;接下来操作索引库里面的文档 目录 一、添加文档 二、查询文档 三、删除文档 四、修改文档 一、添加文档 新增文档的DSL语法如下 POST /索引库名/_doc/文档id(不加id,es会自动生成) { "字段1":"值1", "字段2&q…

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于头脑风暴优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

Vue3 的 emit 该怎么写, vue2 对比

Vue3 的 emit 该怎么写&#xff0c; vue2 对比 这是个新手问题&#xff0c;从 vue2 转到 vue3 之后&#xff0c;一时间不知道该怎么用它了。 vue2 用法 vue2 在 template 中 和 在方法中的用法如下&#xff1a; <template><button click"$emit(clicked, 要传…

贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面

为了满足特定场景的远程访问需求&#xff0c;如&#xff1a;远程群晖NAS设备、远程SQL Server数据库/MySQL数据库、3389远程桌面&#xff08;RDP远程桌面&#xff09;、远程SSH、我的世界游戏联机…… 贝锐花生壳推出了场景映射服务&#xff0c;不仅提供满足相应场景的网络带宽…

在 2024 年搜索中提升排名的 7 项内容调整

忘掉关键词填充和算法追逐。2024 年的重点是 EEAT&#xff0c;宝贝&#xff01;谷歌希望最专业、最权威、最值得信赖&#xff08;EEAT&#xff09;的内容能够排名靠前&#xff0c;这就意味着您的内容需要成为专业知识、参与度和信任度的交响乐。 准备好让搜索引擎和人类都无法…

YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone

前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…

基于Java SSM框架实现四六级在线考试系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现四六级在线考试系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多学院的之中&#xff0c;随之就产生了“四六级在线考试系统”&#xff0c;这样就让四六级在线考试系统更加方便…

kbdnso.dll文件缺失,软件或游戏报错的快速修复方法

很多小伙伴遇到电脑报错&#xff0c;提示“kbdnso.dll文件缺失&#xff0c;程序无法启动执行”时&#xff0c;不知道应该怎样处理&#xff0c;还以为是程序出现了问题&#xff0c;想卸载重装。 首先&#xff0c;先要了解“kbdnso.dll文件”是什么&#xff1f; kbdnso.dll是Win…

2007-2022年上市公司数字化转型数据(区分年报和管理层讨论)(含原始数据+处理代码+结果)

2007-2022年上市公司数字化转型数据&#xff08;年报和管理层讨论&#xff09;&#xff08;含原始数据处理代码结果&#xff09; 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;统计年度、证券代码、人工智能技术、区块链技术、云计算技术、大数据技术、数字技术应用、…

requests库中Session对象超时解决过程

引言 在使用Python进行网络请求时&#xff0c;requests库是一个非常常用的工具。它提供了Session对象来管理和持久化参数&#xff0c;例如cookies、headers等。但是&#xff0c;对于一些需要长时间运行的请求&#xff0c;我们需要设置超时时间来避免长时间等待或者无限期阻塞的…

浏览器使用隧道代理HTTP:洞悉无界信息

在信息爆炸的时代&#xff0c;互联网已经成为获取信息的首选渠道。然而&#xff0c;在某些地区或情况下&#xff0c;访问某些网站可能会受到限制。这时&#xff0c;隧道代理HTTP便成为了一个重要的工具&#xff0c;帮助用户突破限制&#xff0c;洞悉无界信息。 一、隧道代理HT…

上海AI lab大模型微调

教程链接&#xff1a;InternLM学习教程链接 命令行演示结果&#xff1a; web演示结果

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源开放体系 大模型成为热门关键词书生浦语大模型开源历程书生浦语20B开源大模型性能从模型到应用书生浦语全链路开源开放体系数据预训练微调评测部署智能体 大模型成为热门关键词 大模型成为发展通用人工智能的重要途径 书生浦语大模型开源历程 书生浦语…

Apipost多Host服务配置

最近Apipost新增同环境下多host服务的配置功能&#xff0c;本篇文章带来该功能的使用场景及使用方法。 配置方法&#xff1a; 点击右上角眼睛标识进入环境管理 点击添加服务&#xff0c;输入服务名和URL 配置完成后需要在接口目录中选择该目录下需要使用的host服务&#xff0…

架构设计系列之分布式系统 11,12,13,14,15,16,17,18

架构设计系列之分布式系统 11&#xff1a;架构理论 第二部分 引 言 前面的几部分介绍了关于软件架构设计的基本概念、基本理论、演化史、常见架构相关的内容&#xff0c;同时还专门介绍了架构设计相关的组织文化保障、遵循定律以及一个程序员应该如何转型成为架构师&#xf…

灰度发布及声明式资源管理(yaml文件)

一、三种常见的项目发布方式 1&#xff09;蓝绿发布 2&#xff09;灰度发布【常用】 3&#xff09;滚动发布 应用程序升级&#xff0c;面临最大的问题是新旧业务之间的切换 立项-定稿-需求发布-开发-测试-发布&#xff0c;测试上线后&#xff0c;再完美也会有问题&#xff0c;为…

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于回溯搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…