0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么调用函数的时候,有些情况下要传地址?传地址有什么好处?

学益得智能硬件 来源:学益得智能硬件 2023-07-30 10:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

为什么调用函数的时候,有些情况下要传地址?传地址有什么好处?

首先有一种情况,是必须要传地址的,比如交换两个数字。

voidswap(int*x,int*y)
{
    int t = *x;
    *x = *y;
*y=t;
}


int main()
{
    int a = 1, b = 2;
swap(&a, &b);

    return 0;
}
凡是这种涉及到在函数内部修改实参值的,都得要传地址才行,通过地址来间接得修改。

再比如我们前两天讲的,函数如何返回多个数据,也可以提前申请好一块内存,把内存的地址传过去,然后把要返回的多个数据保存在这块内存中,也能解决问题。
voidtest(int*a)
{
    /*结果保存在a中*/
}


int main()
{
intresult[5] = {0};
test(result);

    return 0;
}
除了这种必须传地址的情况,剩下的可以传地址,也可以不传地址,但是传地址的话有时候效率更高。
struct Test
{
int a[1024];
};
比如我们写代码的时候经常用到结构体,我写的这个结构体占了4096字节,如果直接传值,那么形参也要分配4096个字节,而且还得把实参的数据拷贝过来。

但是如果换成地址传递,形参只需要4个字节或者8个字节,保存结构体的地址就行,这种方式,将会大大提高函数调用的效率。

如果结构体再大一些,比如他要占用兆级别的内存空间,如果还是传值,那程序就会很容易奔溃,因为程序的栈空间是有限的,在Linux中默认是8M,过度使用的话,很容易超出它的限制,结果就会不可控。

所以调用函数的时候应该选择传值还是传地址,没有固定的说法。

传值操作简单,通俗易懂,但是对于一些复杂的类型,浪费时间也浪费空间。

17623418-2def-11ee-815d-dac502259ad0.png  

传地址虽然理解起来困难一些,但它能在函数内部去访问实参,对于一些复杂的类型,既能提高调用的效率,又能节省空间。

17913e70-2def-11ee-815d-dac502259ad0.png 





审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    609

    浏览量

    29642
  • LINUX内核
    +关注

    关注

    1

    文章

    318

    浏览量

    23055

原文标题:值传递和地址传递

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言指针做函数参数,指针做函数返回类型

    时候我们可以使用函数的返回值来回数据,在简单的情况下是可以的,但是如果返回值其它用途(例如返回函数
    发表于 10-24 10:42 878次阅读

    esp-wroom-32如何在不使用wifi功能的情况下获取mac地址

    你好 我想检查 esp-wroom-32 模块的mac_address。 我已经通过初始化wifi然后调用函数来esp_get_mac检查了它。 但是,如果我想在不使用 wifi 功能的情况下获取该 mac
    发表于 07-19 09:37

    函数参数据出错

    我在CubSuite+里建了个.c和.h,里面函数参数时,单步调试发现,传过去去的数值不对,而在主函数调用又传对了,这是什么鬼???
    发表于 08-08 17:26

    labview 中怎么获取数值的指针(地址)?调用dll时往里面地址

    labview 中怎么获取数值的指针(地址)?调试一个设备,调用dll时往里面地址,看了官方.h文件,参考了官方的C#代码,自己用lab
    发表于 03-15 08:59

    IP地址,IP地址是什么意思

    IP地址,IP地址是什么意思 基本定义 IP地址都是一个十分重的概念,INTERNET的许多服务和特点都是通过IP地址体现出来的。
    发表于 04-03 15:12 1814次阅读

    C语言回调函数学习

    对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用
    发表于 05-27 09:44 7387次阅读

    C语言函数中的值和指针到底什么区别

    我们可能听过C语言中的值和指针,在其他语言中,也有引用一说,那么他们到底什么区别呢?如果你还不能准确地分辨,就该好好了解一了。
    的头像 发表于 09-08 10:14 5656次阅读

    C语言函数参数关于值和指针什么区别?

    C语言函数参数的值和指针什么区别?
    的头像 发表于 02-26 16:35 2938次阅读

    C语言-函数的定义、声明、

    C语言里函数是非常重要的知识点,一个完整的C语言程序就是由主函数和各个子函数组成的,主函数调用函数
    的头像 发表于 08-14 09:57 2656次阅读

    什么情况下进行电能质量检测?

    什么情况下进行电能质量检测?
    发表于 09-08 14:20 927次阅读

    使用LPNDR_ReadGlobalInfo函数块读取IP地址和MAC地址

    使用 LPNDR_ReadGlobalInfo 函数块可以读取 PROFINET 设备的 IP 地址和 MAC 地址
    的头像 发表于 11-14 10:09 6473次阅读

    函数与递归-2

    调用是把函数外部创建变量的内存地址传递给函数参数的一种调用
    的头像 发表于 02-21 15:53 1079次阅读
    <b class='flag-5'>函数</b>与递归-2

    DNS解析一个地址时候会返回多个IP吗?

    实现一个域名对应多个 IP 地址的效果,只需要在 DNS 解析操作平台,添加一条解析记录,将网站的域名指向服务器的 IP 地址。一般情况下,一个域名对应一个 IP
    的头像 发表于 09-19 17:05 1784次阅读
    DNS解析一个<b class='flag-5'>地址</b>的<b class='flag-5'>时候</b>会返回多个IP吗?

    什么情况下避免使用系统调用

    制。如果对变量的每次访问都使用上述机制,由于系统调用会陷入内核空间,需要频繁的进行上下文切换,这就导致了程序的时间开销比较大。 自然的,我们就想到,在多线程环境中,在某些情况下是否能减少甚至避免使用系统调用?答案是肯
    的头像 发表于 11-13 10:32 896次阅读
    什么<b class='flag-5'>情况下</b>避免使用系统<b class='flag-5'>调用</b>

    什么情况下IP地址会相同?

    呈现的是路由器的公网IP地址,所以当我们进行外部通信的时候,它们在这一层面的IP地址相同。 简单来说,你在家里和家人所有的设备都是通过家里的路由上网,对于外部的网站来说,他们的IP地址
    的头像 发表于 11-19 11:20 3136次阅读
    什么<b class='flag-5'>情况下</b>IP<b class='flag-5'>地址</b>会相同?