结构体小知识

news/2024/9/17 7:13:07/ 标签: 开发语言, c语言

目录

  • 前言
  • 1.结构体数组
    • 1.1结构体数组理解
    • 1.2结构体数组知识运用
    • 1.3 -> 操作符
  • 2. 知识拓展

前言

本期blog是对上一期指针知识的知识补充,如果各位大佬感兴趣的话,可以结合起来一起看!
在这里插入图片描述

1.结构体数组

1.1结构体数组理解

结构体数组在本质上是数组,里面存放的是结构体的数据。

1.2结构体数组知识运用

现在我们举例来讲解。首先创建一个结构体的类型,之后用该结构体的类型创建一个数组,可以类比int类型的数组进行创建,并用大括号括起来。现在假设我们有一个结构体,里面有一个int类型的数组arr,arr里面有1000个元素,再有一个int类型的n。

struct S
{int arr[1000];int n;
};

在主函数部分创建一个名字为s的变量,并对它进行初始化。

struct S
{int arr[1000];int n;
};int main()
{struct S s = { {1,2,3,4,5},100 };return 0;
}

现在我们要对s里面的数据进行修改,这里我不采用直接使用s.n = 200的方式进行修改。我添加一个函数(set_stu)对s进行修改。在函数的形参部分我采用一个结构体变量来接收,并在函数里面对数据进行修改。我们可以添加一个print_stu函数打印看看。

#include<stdio.h>
struct S
{int arr[1000];int n;
};void set_stu(struct S t)
{t.n = 200;t.arr[0] = -1;t.arr[1] = -2;
}void print_stu(struct S t)
{printf("n = %d\n", t.n);int i = 0;for (i = 0; i < 5; i++){printf("%d ", t.arr[i]);}
}int main()
{struct S s = { {1,2,3,4,5},100 };set_stu(s);print_stu(s);return 0;
}

运行结果:
在这里插入图片描述
但是运行结果显示里面的数据并没有发生改变。那是哪里出问题了呢?
在主函数中,我们用s进行传参,传给set_stu函数的t,这叫做值传递。s有自己的空间,此处的t也有自己的空间。这里我们将数据传给了t,再对t进行改变,并不会影响到s,所以在打印时s的值不变。
该问题可以通过传址解决。我们可以将结构体变量s的地址传过去,把set_stu函数的形参部分改为结构体指针(ps)进行接收,并把该函数里面的内容也进行修改。

#include<stdio.h>
struct S
{int arr[1000];int n;
};void set_stu(struct S* ps)
{(*ps).n = 200;(*ps).arr[0] = -1;(*ps).arr[1] = -2; 
}void print_stu(struct S t)
{printf("n = %d\n", t.n);int i = 0;for (i = 0; i < 5; i++){printf("%d ", t.arr[i]);}
}int main()
{struct S s = { {1,2,3,4,5},100 };set_stu(&s);print_stu(s);return 0;
}

运行结果:
在这里插入图片描述
该写法是对指针变量进行解引用,然后找到结构体变量进行修改。但是还有其他的方法。

1.3 -> 操作符

#include<stdio.h>
struct S
{int arr[1000];int n;
};void set_stu(struct S* ps)
{ps->n = 200;ps->arr[0] = -1;ps->arr[1] = -2;
}void print_stu(struct S t)
{printf("n = %d\n", t.n);int i = 0;for (i = 0; i < 5; i++){printf("%d ", t.arr[i]);}
}int main()
{struct S s = { {1,2,3,4,5},100 };set_stu(&s);print_stu(s);return 0;
}

运行结果:
在这里插入图片描述
该方法更加直观,这种写法用到了->(操作符)。
注意:
该操作符的左边一定要是结构体的指针变量,右边是成员名。
在这里插入图片描述

2. 知识拓展

思考:
在print_stu函数这里需要传递s的地址吗?在这里我们仅仅是为了打印。
分析:
之前进行运行的时候,我们发现该函数是能够完成该功能的,即不传址也可以。print_stu函数的t得到的是改变后s的数据,并照着去打印。但是我建议还是尽量传址。
尽量传址的原因:
在这个例子中,我创建了一个非常大的结构体,这里的结构体对象很大,4000个字节加上n。在主函数部分创建s的时候,是一块非常大的空间。如果采用值传递时,t的创建也需要一块非常大的空间,此时就会有空间上的浪费。除此之外,拷贝数据过去时,时间和空间上都造成了浪费,即时间和空间的双重开销。当然这是理论上的,如果编译器在这方面做了优化,这又是另外一回事。

现在我们将地址传过去,并把print_stu函数的形参部分改为指针(ps)。

#include<stdio.h>
struct S
{int arr[1000];int n;
};void set_stu(struct S* ps)
{ps->n = 200;ps->arr[0] = -1;ps->arr[1] = -2;
}void print_stu(struct S* ps)
{printf("n = %d\n", ps->n);int i = 0;for (i = 0; i < 5; i++){printf("%d ", ps->arr[i]);}
}int main()
{struct S s = { {1,2,3,4,5},100 };set_stu(&s);/*print_stu(s);*/print_stu(&s);return 0;
}

在这里插入图片描述
现在我们传地址的话,就传递了4个字节或8个字节,之前我们说过一个地址的大小为4个字节或8个字节。在压栈时,只会指针变量压了一个栈,此时我们并没有创建两个结构体。所以只是为了打印数据,值传递也行,能解决问题。但是还是建议尽量传递地址,采用传址的形式。

结论
结构体传参的时候,尽量传递地址。

好了,今天我们的结构体知识就讲到这里。如果文章内容有误,请大佬在评论区斧正!谢谢大家!

在这里插入图片描述


http://www.ppmy.cn/news/1522610.html

相关文章

pytorch torch.nn.functional.one_hot函数介绍

torch.nn.functional.one_hot 是 PyTorch 中用于生成独热编码&#xff08;one-hot encoding&#xff09;张量的函数。独热编码是一种常用的编码方式&#xff0c;特别适用于分类任务或对离散的类别标签进行处理。该函数将整数张量的每个元素转换为一个独热向量。 函数签名 tor…

notepad++软件介绍(含安装包)

Notepad 是一款开源的文本编辑器&#xff0c;主要用于编程和代码编辑。它是一个功能强大的替代品&#xff0c;常常被用来替代 Windows 系统自带的记事本。 Notepad win系统免费下载地址 以下是 Notepad 的一些主要特点和功能&#xff1a; 多语言支持&#xff1a;Notepad 支持多…

Kafka【八】如何保证消息发送的可靠性、重复性、有序性

【1】消息发送的可靠性保证 对于生产者发送的数据&#xff0c;我们有的时候是不关心数据是否已经发送成功的&#xff0c;我们只要发送就可以了。在这种场景中&#xff0c;消息可能会因为某些故障或问题导致丢失&#xff0c;我们将这种情况称之为消息不可靠。虽然消息数据可能会…

proxy代理解决vue中跨域问题

vue.config.js module.exports {...// webpack-dev-server 相关配置devServer: {host: 0.0.0.0,port: port,open: true,proxy: {/api: {target: https://vfadmin.insistence.tech/prod-api,changeOrigin: true,pathRewrite: {//[^ process.env.VUE_APP_BASE_API]: ^/api: / …

【 html+css 绚丽Loading 】000044 两仪穿行轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

【sql】评估数据迁移复杂度调查汇报240904

难度判断标准&#xff1a; - 高难度&#xff1a;使用多个表&#xff08;TBL&#xff09;或有多个join操作的工具 - 低难度&#xff1a;表数量少且没有join操作的简单工具 - 中等难度&#xff1a;介于高低之间&#xff0c;有少量join操作的工具 5. 最后说明不需要仔细…

25届计算机毕业设计:3步打造北部湾助农平台,Java SpringBoot实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

AF透明模式/虚拟网线模式组网部署

透明模式组网 实验拓扑 防火墙基本配置 接口配置 eth1 eth3 放通策略 1. 内网用户上班时间&#xff08;9:00-17:00&#xff09;不允许看视频、玩游戏及网上购物&#xff0c;其余时 间访问互联网不受限制&#xff1b;&#xff08;20 分&#xff09; 应用控制策略 2. 互联…

[论文笔记]RAFT: Adapting Language Model to Domain Specific RAG

引言 今天带来一篇结合RAG和微调的论文&#xff1a;RAFT: Adapting Language Model to Domain Specific RAG。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 本文介绍了检索增强微调(Retrieval Augmented Fine Tunin…

【Impala SQL 造数(一)】

前言 SQL 造数即生成测试数据&#xff0c;一般是编码完成之后的测试阶段所需&#xff0c;测试数据可以用于多种目的&#xff0c;包括测试应用程序的功能、业务场景测试、性能测试、数据恢复测试等。在测试阶段特别是数据类需求&#xff0c;需要很多造数场景&#xff0c;像 Hiv…

尚品汇-支付宝支付同步异步回调实现(四十七)

目录&#xff1a; &#xff08;1&#xff09;订单支付码有效时间 &#xff08;2&#xff09;支付后回调—同步回调 &#xff08;3&#xff09;支付宝回调—异步回调 &#xff08;1&#xff09;订单支付码有效时间 &#xff08;2&#xff09;支付后回调—同步回调 static修饰…

【Jupyter Notebook】安装与使用

打开Anaconda Navigator点击"Install"(Launch安装前是Install)点击"Launch"点击"File"-"New"-"Notebook"​ 5.点击"Select"选择Python版本 6.输入测试代码并按"Enter+Shift"运行代码: 代码如下: …

考研系列-408真题数据结构篇(18-23)

写在前面 此文章是本人在备考过程中408真题数据结构部分(2018年-2023年)的易错题及相应的知识点整理,后期复习也尝尝用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2018年 1.堆的建立(从后往前进行调整) 2.算法(正整数和数组之间关系的建立)

k8s API资源对象ingress

有了Service之后&#xff0c;我们可以访问这个Service的IP&#xff08;clusterIP&#xff09;来请求对应的Pod&#xff0c;但是这只能是在集群内部访问。 要想让外部用户访问此资源&#xff0c;可以使用NodePort&#xff0c;即在node节点上暴漏一个端口出来&#xff0c;但是这…

pytorch+深度学习实现图像的神经风格迁移

本文的完整代码和部署教程已上传至本人的GitHub仓库&#xff0c;欢迎各位朋友批评指正&#xff01; 1.各代码文件详解 1.1 train.py train.py 文件负责训练神经风格迁移模型。 加载内容和风格图片&#xff1a;使用 utils.load_image 函数加载并预处理内容和风格图片。初始化…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…

Java中等题-摆动序列(力扣)

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

数据库锁之行级锁、记录锁、间隙锁和临键锁

1. 行级锁 InnoDB 引擎支持行级锁&#xff0c;而MyISAM 引擎不支持行级锁&#xff0c;只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句&#xff0c;是不会加记录锁的&#xff0c;因为它属于快照读&#xff0c;通过在MVCC中的undo log版本链实现。如果要在查询时对…

Python 安装selenium的办法

之前一直安装python以为要进入python的菜单进行输入 如下 老是提示错误,原来是我搞错了,安装这个直接进入cmd即可 如下 pip install selenium 再用pip list查看一下是否安装成功

git 提交代码由原先账号密码调整为ssh

如果你希望将 Git 提交代码的身份验证方式从用户名和密码切换到 SSH&#xff0c;你需要进行以下几个步骤&#xff1a; 1. 生成 SSH 密钥对 如果你还没有 SSH 密钥对&#xff0c;可以使用以下命令生成一个新的密钥对&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_em…