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

    文章

    574

    浏览量

    27035
  • LINUX内核
    +关注

    关注

    1

    文章

    313

    浏览量

    21433

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

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

收藏 人收藏

    评论

    相关推荐

    四种获取内核函数地址的方法

    在内核调试中,经常需要知道某个函数地址,或者根据函数地址找到对应的函数,从而进行更深一步的debug。
    的头像 发表于 11-17 16:58 844次阅读
    四种获取内核<b class='flag-5'>函数</b><b class='flag-5'>地址</b>的方法

    STM32开发板在用数据线与电脑连接的情况下,在无线数模块,数据传送不正确的原因?

    STM32开发板在用数据线与电脑连接的情况下,传送的数据可以正确的被电脑的串口助手接收,但在无线数模块,数据传送不正确,无线数模块是没问题的,它们可以实现两台电脑之间的正常通信,
    发表于 05-17 06:21

    调用函数,实参如何传递的?

    请问,函数传递时,实参是数组名【例如fun(shuzu)】,结构变量名【例如fun(jiegou)】,联合变量名【例如fun(lianhe)】或者联合变量名.数组名(例如fun(lianhe.shuzu)),这样的话是不是的是这些变量的首
    发表于 10-09 10:57

    函数参数据出错

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

    为什么USART参数的时候会有错误?

    需要调试的参数列表里面已经了,为什么参数的时候会有错误
    发表于 08-02 04:37

    为什么写地址使用函数

    ;\} 为什么写地址使用函数,而写数据用宏定义? 各有什么优点?网上看宏定义和调用函数的区别,结果是宏定义更快,而调用
    发表于 05-04 04:35

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

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

    结构体做函数参数三种传递方式

    1.结构体的参数传递在进行值的时候,用结构体封装有利于函数的传递。用指向结构体变量的指针作为函数参数。结构体做函数参数
    发表于 08-24 06:36

    如何解决hal库usart串口回卡死在硬件错误和丢失的问题

    时候要将除数据以外的全部粘贴。还有一个问题就是编好程序烧录以后发现长数据时我多个数据会出现一个字节丢一个字节的问题。接收中断回调函数
    发表于 01-20 06:07

    ARMv8的函数调用栈是什么意思?调用栈的内存管理是怎样的

    ,在某些体系结构里,还需要涉及到函数调用指令,如BL;以获取被调用函数的入口地址。在这种情况下
    发表于 05-13 10:36

    CH579M蓝牙透例程怎么修改MAC地址

    CH579M蓝牙透例程怎么修改MAC地址
    发表于 07-26 06:23

    mac地址和ip地址是什么决定的

    上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。目前还有些ip代理软件,但大部分都收费。
    发表于 03-07 17:14 7053次阅读
    mac<b class='flag-5'>地址</b>和ip<b class='flag-5'>地址</b>是什么决定的

    智能合约如何应对区块链地址验证欺骗?

    攻击者诱使原合约(Phishable.sol)的owner发送ether到攻击合约(POC.sol)地址,然后调用攻击合约的fallback函数,执行attack()函数,此时phOw
    发表于 08-20 09:43 4312次阅读

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

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

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

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