传值调用 VS 传址调用 VS 引用调用

/***
 * 传值调用
 * 传址调用
 * 引用调用
 *
 * ***/
#include<iostream>
using namespace std;

void swap_num(int x, int y);
void swap_addr(int * x, int * y);
void swap_quote(int & x, int & y);


int main()
{

	int a = 3, b = 2;

	cout<<"原始数据:"<<"  a= "<<a<<"  b= "<<b<<endl;

	swap_num(a, b);
	cout<<"传值调用:"<<"  a= "<<a<<"  b= "<<b<<endl;

	swap_addr(&a, &b);
	cout<<"传址调用:"<<"  a= "<<a<<"  b= "<<b<<endl;

	swap_quote(a, b);
	cout<<"引用调用:"<<"  a= "<<a<<"  b= "<<b<<endl;

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

}



//
/*
 * 完成交换
 * 传址调用实际上还是实参到形参的拷贝,
 * 不过这次实参是要交换的两个数字的指针(即地地址),而不是要交换的两个数本身,
 * 虽然形参在swap结束后被销毁,但是形参是根据要交换的两个数的地址完成交换的,
 * 所以对这两个数字产生影响,也就完成交换
 */
void swap_addr(int * x, int * y)
{
    int tmp = *x;
    *x = *y;
    *y = tmp;

}


//
/*
 * 完成交换,
 * 但是这里的语法和上面的两种都不一样,
 * 这里并没有实参到形参的拷贝,而是直接将main里面的a, b传到swap里面,
 * 所以当然交换的就是a, b的值。
 */
//这段代码如果用gcc编译会报错,因为引用调用在C里面不合法,要用g++进行编译
void swap_quote(int & x, int & y)
{
    int tmp = x;
    x = y;
    y = tmp;

}




//

结果如下:

//

原始数据:  a= 3  b= 2
传值调用:  a= 3  b= 2
传址调用:  a= 2  b= 3
引用调用:  a= 3  b= 2




参考:https://segmentfault.com/a/1190000003696397

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值