函数的传值调用,传址调用和引用调用分析-创新互联
函数的传值调用和传址调用在C和C++中都是合法的语法,但是引用调用就只是在C++中合法的。
创新互联建站主要从事成都网站制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务北塔,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-869222201.传值调用:
程序:
#include
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
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
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
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 参数。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
文章标题:函数的传值调用,传址调用和引用调用分析-创新互联
转载注明:http://scyanting.com/article/poces.html