为什么调用函数的时候,有些情况下要传地址?传地址有什么好处?
首先有一种情况,是必须要传地址的,比如交换两个数字。
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,过度使用的话,很容易超出它的限制,结果就会不可控。
所以调用函数的时候应该选择传值还是传地址,没有固定的说法。
传值操作简单,通俗易懂,但是对于一些复杂的类型,浪费时间也浪费空间。
传地址虽然理解起来困难一些,但它能在函数内部去访问实参,对于一些复杂的类型,既能提高调用的效率,又能节省空间。
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Linux系统
+关注
关注
4文章
609浏览量
29642 -
LINUX内核
+关注
关注
1文章
318浏览量
23055
原文标题:值传递和地址传递
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
esp-wroom-32如何在不使用wifi功能的情况下获取mac地址?
你好
我想检查 esp-wroom-32 模块的mac_address。
我已经通过初始化wifi然后调用函数来esp_get_mac检查了它。
但是,如果我想在不使用 wifi 功能的情况下获取该 mac
发表于 07-19 09:37
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语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。
使用LPNDR_ReadGlobalInfo函数块读取IP地址和MAC地址
使用 LPNDR_ReadGlobalInfo 函数块可以读取 PROFINET 设备的 IP 地址和 MAC 地址。
DNS解析一个地址的时候会返回多个IP吗?
要实现一个域名对应多个 IP 地址的效果,只需要在 DNS 解析操作平台,添加一条解析记录,将网站的域名指向服务器的 IP 地址。一般情况下,一个域名对应一个 IP
什么情况下避免使用系统调用
制。如果对变量的每次访问都使用上述机制,由于系统调用会陷入内核空间,需要频繁的进行上下文切换,这就导致了程序的时间开销比较大。 自然的,我们就想到,在多线程环境中,在某些情况下是否能减少甚至避免使用系统调用?答案是肯
什么情况下IP地址会相同?
呈现的是路由器的公网IP地址,所以当我们进行外部通信的时候,它们在这一层面的IP地址相同。 简单来说,你在家里和家人所有的设备都是通过家里的路由上网,对于外部的网站来说,他们的IP地址

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