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

描述

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

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

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


int main()
{
    int a = 1, b = 2;
    swap(&a, &b);
    
    return 0;
}
凡是这种涉及到在函数内部修改实参值的,都得要传地址才行,通过地址来间接得修改。

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


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

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

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

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

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

LINUX内核  

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

LINUX内核 





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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分