为什么调用函数的时候,有些情况下要传地址?传地址有什么好处?
首先有一种情况,是必须要传地址的,比如交换两个数字。
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](https://file1.elecfans.com//web2/M00/9F/79/wKgZomToN6WAJ5N5AAijsJifr6M404.png)
传地址虽然理解起来困难一些,但它能在函数内部去访问实参,对于一些复杂的类型,既能提高调用的效率,又能节省空间。
![17913e70-2def-11ee-815d-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9F/79/wKgZomToN6aAHzRTAAixI4RuFVI562.png)
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Linux系统
+关注
关注
4文章
574浏览量
27035 -
LINUX内核
+关注
关注
1文章
313浏览量
21433
原文标题:值传递和地址传递
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
STM32开发板在用数据线与电脑连接的情况下,在无线数传模块下,数据传送不正确的原因?
STM32开发板在用数据线与电脑连接的情况下,传送的数据可以正确的被电脑的串口助手接收,但在无线数传模块下,数据传送不正确,无线数传模块是没问题的,它们可以实现两台电脑之间的正常通信,
发表于 05-17 06:21
调用函数,实参如何传递的?
请问,函数传递时,实参是数组名【例如fun(shuzu)】,结构变量名【例如fun(jiegou)】,联合变量名【例如fun(lianhe)】或者联合变量名.数组名(例如fun(lianhe.shuzu)),这样的话是不是传的是这些变量的首
发表于 10-09 10:57
labview 中怎么获取数值的指针(地址)?调用dll时要往里面传地址
labview 中怎么获取数值的指针(地址)?调试一个设备,调用dll时要往里面传地址,看了官方.h文件,参考了官方的C#代码,自己用lab
发表于 03-15 08:59
如何解决hal库usart串口回传卡死在硬件错误和丢失的问题
的时候要将除数据以外的全部粘贴。还有一个问题就是编好程序烧录以后发现传长数据时我传多个数据会出现传一个字节丢一个字节的问题。接收中断回调函数
发表于 01-20 06:07
智能合约如何应对区块链地址验证欺骗?
攻击者诱使原合约(Phishable.sol)的owner发送ether到攻击合约(POC.sol)地址,然后调用攻击合约的fallback函数,执行attack()函数,此时phOw
发表于 08-20 09:43
•4312次阅读
使用LPNDR_ReadGlobalInfo函数块读取IP地址和MAC地址
使用 LPNDR_ReadGlobalInfo 函数块可以读取 PROFINET 设备的 IP 地址和 MAC 地址。
DNS解析一个地址的时候会返回多个IP吗?
要实现一个域名对应多个 IP 地址的效果,只需要在 DNS 解析操作平台,添加一条解析记录,将网站的域名指向服务器的 IP 地址。一般情况下,一个域名对应一个 IP 地址,也就只需添加
![DNS解析一个<b class='flag-5'>地址</b>的<b class='flag-5'>时候</b>会返回多个IP吗?](https://file1.elecfans.com/web2/M00/A5/37/wKgaomUJZMaAE_h9AAAmqyoQV14000.png)
评论