函数的传值调用,传址调用和引用调用分析

函数的传值调用和传址调用在CC++中都是合法的语法,但是引用调用就只是在C++中合法的。

1.传值调用

程序:

#include<stdio.h>


void swap(int x, int y)

{

int tmp = x;

x = y;

y = tmp;

}


int main(void)

{

int a = 1, b = 2;

printf("a=%d, b=%d\n", a, b);

swap(a, b);

printf("a=%d, b=%d\n", a, b);

system("pause");

return 0;

}

运行结果

a=1, b=2

a=1, b=2

请按任意键继续. . . 

 

分析:并没有完成交换,因为在传参调用中,main调用swap时候,将实参a, b的值分别拷贝给形参x, y,然后a, b就不再和swap有关了,swap交换的是x, y的值,但是x, y的作用域只在swap中,他们确实完成了交换,但是swap结束之后,x, y的值也就随之销毁了,所以根本不会对行参有任何影响,当然就不会实现实参的交换

 

2.传址调用

程序:

#include<stdio.h>


void swap(int *x, int *y)

{

int tmp = *x;

*x = *y;

*y = tmp;

}


int main(void)

{

int a = 1, b = 2;

printf("a=%d, b=%d\n", a, b);

swap(&a, &b);

printf("a=%d, b=%d\n", a, b);

system("pause");

return 0;

}

运行结果

a=1, b=2

a=2, b=1

请按任意键继续. . .

分析:完成了交换原因是这样的,传址调用实际上还是实参到形参的拷贝,不过这次实参是要交换的两个数字的指针(即地址),而不是要交换的两个数本身,虽然形参在swap结束后被销毁,但是形参是根据要交换的两个数的地址完成交换的,所以对这两个数字产生影响,也就完成交换

 

3.引用调用

这个语法在C++里合法,但是在C里面是没有的

程序1

#include<stdio.h>


void swap(int &x, int &y)

{

int tmp = x;

x = y;

y = tmp;

}


int main(void)

{

int a = 1, b = 2;

printf("a=%d, b=%d\n", a, b);

swap(a, b);

printf("a=%d, b=%d\n", a, b);

system("pause");

return 0;

}


注意:这段代码如果用c编译会报错,因为引用调用在C里面不合法,要用c++语言进行编译

 

程序2

#include<iostream>

using namespace std;


void swap(int &x, int &y)

{

int tmp = x;

x = y;

y = tmp;

}


int main(void)

{

int a = 1, b = 2;

printf("a=%d, b=%d\n", a, b);

swap(a, b);

printf("a=%d, b=%d\n", a, b);

system("pause");

return 0;

}

运行结果

a=1, b=2

a=2, b=1

请按任意键继续. . .

 

分析:可以看到实现了两个数字的交换,但是这里的语法和上面的两种都不一样,这里并没有实参到形参的拷贝,用的是同一块内存空间,而是直接将main里面的a, b传到swap里面,所以当然交换的就是a, b的值。

 

建议:对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)只是建议在传结构体或类对象的时候使用const 参数。

 


本文出自 “岩枭” 博客,请务必保留此出处http://yaoyaolx.blog.51cto.com/10732111/1765776

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值