当前位置: 首页 > news >正文

【初始C语言8】详细讲解初阶结构体的知识

前言

💓作者简介: 加油,旭杏,目前大二,正在学习C++数据结构等👀
💓作者主页:加油,旭杏的主页👀

⏩本文收录在:再识C进阶的专栏👀

🚚代码仓库:旭日东升 1👀

🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖

学习目标:

       在上一章中,我们浅浅地学习了初阶指针的相关知识,而这一章中,我们要学习结构体。可能有很多小伙伴不知道或者没有听过这个名词,在前面C语言总结中的数据类型中,我们讲述了一些数据类型,但是在生活中,肯定有这些结构体所不能表示的复杂数据类型,这样在C语言中,我们为了可以表示这些复杂数据类型,我们引出了结构体的概念!


学习内容:

通过上面的学习目标,我们可以列出要学习的内容:

  1. 结构体类型的声明
  2. 结构体初始化
  3. 结构体成员的访问
  4. 结构体传参

一、结构体类型的声明

1.1 结构的基础知识

       小编先在这里声明一下:标题中的结构就是结构体的意思结构是一些值的集合,这些值称为成员变量。结构的每一个成员可以是不同类型的变量这里是不是很熟悉,在之前数组的章节中,数组是存放一组相同类型的元素的集合。

       这一小节主要了解一下结构体的概念以及将其与数组区分开了,重点还是数组与结构体的区别

1.2 结构的声明

struct tag{member list;  //成员变量的列表
}variable-list;  //变量列表

为什么要学习结构体呢? 

       因为当前学习过的类型都是内置类型,比如:char、short、int、double……而如果我们想用C语言描述一个人的时候,怎么描述:人有名字、性别、年龄、电话、地址等因素,因此称其为复杂对象,人的一些因素就对应结构体中的成员列表,这就引入了结构体

下面我们来举个例子:

struct Stu {//学生的相关属性char name[20];int age;char sex[5];char add[30];
}s3, s4;
//s3,s4是结构体类型的变量,是全局变量int main()
{struct Stu s1;
//s1是结构体类型的变量,是局部变量
}

注意事项:

       在声明结构体变量的时候,可以将 struct 省略吗?一般是不可以的,但是如果你使用typedef 对结构体进行重命名,这样就可以省略 struct:

typedef struct Stu {//学生的相关属性char name[20];int age;char sex[5];char add[30];
}Stu;  //Stu是重命名产生的新的类型Stu s5;  //这样就可以了

1.3 结构成员的类型

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

1.4 结构体变量的定义和初始化

结构体变量的定义(全局变量和局部变量)有几种方法:

//还是以学生的结构体为例
struct Stu {//学生的相关属性char name[20];int age;char sex[5];char add[30];
}s1; //s1是全局变量
struct Stu s2;  //s2是全局变量int main(){struct Stu s3; //s3是局部变量
}

结构体变量的初始化操作:

       数组的初始化是用大括号,结构体变量的初始化也是使用大括号进行赋值。为了使读者会进行其初始化操作,我们来使用一个比较复杂的结构体类型:

struct B {int c;char ch;
};
struct s {char c;int num;int arr[10];double* pd;struct B sb;struct B* ptr;
};
int main() {double b = 3.78;//按照顺序初始化struct s s1 = { 'a', 3, { 1,2,3 }, &b, {4, 'f'}, NULL }; //局部变量//指定成员初始化struct s s2 = { .num = 400, .arr = {5,6,7} };
}

二、结构体成员的访问

1. 结构体变量.成员名

2. 结构体指针->成员名

       在前面的操作符中,我们了解了这两个操作符,下面让我们进一步深入研究。在讲之前,我们在来回顾一个易错点

struct S {int age;char name[20];
};
void my_set(struct S t) {t.age = 19;strcpy(t.name, "zhangsan");
}
int main()
{struct S s = { 0 };my_set(s);
}

       这是一个典型的错误,经典的错误,标准的零分。形参是实参的临时拷贝,改变形参的值不会影响实参的值。

改进方法:

void my_set(struct S* ps) {ps->age = 19;strcpy(ps->name, "zhangsan");
}

三、结构体传参

下面我们来写一下打印结构体的函数:

void my_print1(struct S t) {printf("%d %s", t.age, t.name);
}void my_print2(struct S* ps) {printf("%d %s", ps->age, ps->name);
}

这两种函数都可以将结构体的内容打印出来,但是这两个函数哪个更优呢?

答案:肯定是第二个。

原因:

       函数传参的时候,我们需要将参数进行圧栈的;如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。

总结:结构体传参的时候,尽量传结构体的地址。 

四、总结 

       这一章的内容还是比较简单,也是比较少的,如果觉得这一章的知识掌握的非常好,可以去看一下我的另外一篇关于结构体的知识:结构体进阶 。

学习产出:

  1. 结构体类型的声明
  2. 结构体初始化
  3. 结构体成员的访问
  4. 结构体传参

相关文章:

【初始C语言8】详细讲解初阶结构体的知识

前言 💓作者简介: 加油,旭杏,目前大二,正在学习C,数据结构等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏&#x1…...

<C++> IO流

C语言的输入与输出 在C语言当中,我们使用最频繁的输入输出方式就是scanf与printf: scanf: 从标准输入设备(键盘)读取数据,并将读取到的值存放到某一指定变量当中。printf: 将指定的数据输出到…...

基于单目相机的2D测量(工件尺寸和物体尺寸)

目录 1.简介 2.基于单目相机的2D测量 2.1 想法: 2.2 代码思路 2.2 主函数部分 1.简介 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造:在工业制造过程中,精确测量是确保产品质量和一致性的关键。基于单目相机的2…...

23面向对象案例1

目录 1、计算连续表达式的一个过程 2、优化后的代码 为什么不能return resultn? 3、用面向对象的方法可以解决冗余的问题,但是还是不能解决result的值可以被随意修改的问题 4、解决不能被随意修改的问题,可以将类属性改成私有变量吗&…...

go语言基础之常量与itoa

视频学习地址:Go零基础入门_在线视频教程-CSDN程序员研修院 一. 常量 定义:常量是一个简单值的标识符,在程序运行时,不会被修改的量。注意:常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数…...

民宿酒店订房房态商城小程序的作用是什么

外出旅游出差,酒店民宿总是很好的选择,随着经济复苏,各地旅游及外出办公人次增多,酒店成绩随之增加,市场呈现多品牌酒店经营形式。 区别于以前,如今互联网深入各个行业,酒店经营也面临着困境。…...

acwing算法基础之数据结构--栈和队列

目录 1 知识点2 模板 1 知识点 栈:先进后出。先进的就是栈底,后进的就是栈顶。后进先出嘛,所以在栈顶弹出元素。 队列:先进先出。先进的就是队头,后进的就是队尾。先进先出嘛,所以在队头弹出元素。 单调…...

关于导出的Excel文件的本质

上篇文章中提到关于xlsx改造冻结窗格的代码,我是怎么知道要加pane的呢,加下来就把我的心路历程记录一下。 我改造之前也是没有头绪的,我网上查了很多,只告诉我如何使用,但源码里没有针对!freeze的处理,所以…...

Rust中FnOnce如何传递给一个约束Fn的回调

Rust中FnOnce如何传递给一个约束Fn的回调 下面的代码&#xff0c;set_cb(func);会报错&#xff0c;如何包装能够做到这样的效果&#xff1a; fn set_cb<F: Fn() static>(handler: F) {handler(); }fn main() {let join_handle std::thread::spawn(|| {});let func |…...

【JUC】线程通信与等待唤醒机制

文章目录 1. 线程通信2. Object类中的wait和notify方法实现等待和唤醒3. Condition接口中的await和signal方法实现等待和唤醒4. LockSupport实现等待和唤醒4.1 优点 1. 线程通信 多个线程在处理同一个资源&#xff0c;但是处理的动作&#xff08;线程的任务&#xff09;却不相…...

C#面对对象(英雄联盟人物管理系统)

目录 英雄信息类 因为要在两个窗体里面调用字典&#xff0c;所以要写两个类来构建全局变量 添加功能 查询功能 英雄信息类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WindowsFormsApp…...

2023年中国分布式光纤传感产量、需求量及行业市场规模分析[图]

分布式光纤传感器中的光纤能够集传感、传输功能于一体&#xff0c;能够完成在整条光纤长度上环境参量的空间、时间多维连续测量&#xff0c;具有结构简单、易于布设、性价比高、易实现长距离等独特优点&#xff0c;常用的分布式光纤传感器有光时域反射仪、布里渊分析仪、喇曼反…...

B2R Raven: 2靶机渗透

B2R Raven: 2靶机渗透 视频参考&#xff1a;ajest &#xff1a;https://www.zhihu.com/zvideo/1547357583714775040?utm_id0 原文参考&#xff1a;ajest &#xff1a;https://zhuanlan.zhihu.com/p/270343652 文章目录 B2R Raven: 2靶机渗透1 启动靶机&#xff0c;查看后网卡…...

SpringBoot-黑马程序员-学习笔记(六)

目录 76.常用计量单位使用 77.bean属性校验 81.测试表现层 82.发送虚拟请求 94.springboot读写redis的客户端 100.ElasticSearch&#xff08;简称ES&#xff09; 一个分布式全文搜索引擎 76.常用计量单位使用 Data Component ConfigurationProperties(prefix "serve…...

unity2022版本 实现手机虚拟操作杆

简介 在许多移动游戏中&#xff0c;虚拟操纵杆是一个重要的用户界面元素&#xff0c;用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆&#xff0c;提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆&#xff0c;如固定和跟随&#xff0c;以及如…...

『GitHub Actions』部署静态博客指南

前言 之前博主是使用的 Jenkins 实现 vuepress 博客的自动部署与持续交付&#xff0c;但是因为现在迁移服务器到海外&#xff0c;并且服务器配置降低。现在经常出现服务器的 Jenkins 构建过程中 CPU 占用率过高&#xff0c;导致服务器卡死 然后我想的话既然只是部署静态博客&…...

WPF Datagrid Header数据绑定,表头复选框实现全选、全否、部分选中,根据条目动态变化

制作一个根表头为CheckBox可全选、全不选的列表&#xff0c;且可根据条目自动调整CheckBox的状态&#xff08;选中、不选、部分选中&#xff09;。 本来是想用DataGrid做一个CheckBox的列用于勾选其中的某些行&#xff0c;当时做出来之后想着添加一个全选、全否的功能。做两个…...

Tensorflow2 中对模型进行编译,不同loss函数的选择下输入数据格式需求变化

一、tf2中常用的损失函数介绍 在 TensorFlow 2 中&#xff0c;编译模型时可以选择不同的损失函数来定义模型的目标函数。不同的损失函数适用于不同的问题类型和模型架构。下面是几种常见的损失函数以及它们的作用和适用场景&#xff1a; 1.均方误差&#xff08;Mean Squared …...

【python】基础语法(三)--异常、模块、包

异常 代码中出现的报错问题&#xff0c;可能会导致整个代码的停止&#xff0c;为了避免这种情况&#xff0c;有了捕获异常操作&#xff1b; 捕获异常 提前预知可能出错的代码&#xff0c;做好准备&#xff0c;避免因bug导致整个项目停止&#xff1b; try&#xff1a;可能出…...

XGBoost+LR融合

1、背景简介 xgboostlr模型融合方法用于分类或者回归的思想最早由facebook在广告ctr预测中提出&#xff0c;其论文Practical Lessons from Predicting Clicks on Ads at Facebook有对其进行阐述。在这篇论文中他们提出了一种将xgboost作为feature transform的方法。大概的思想…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...