C++值传递和地址传递解析

先说结论:值传递不改变实参,地址传递改变实参

(小声BB:大家都知道)

那么值传递为什么是改变形参,或者说值传递的流程到底是怎样的?
案例1:

int main() {
	int a = 10;
	int b = 20;
	test1(a, b);
	cout	<<"a = "<<a;
	system("pause");

	return 0;
}
void test1(int a1, int b1)
{
	int temp = a1;
	a1 = b1;
	b1 = temp;
	cout <<"a = "<<a1;
}

main函数调用test1实现a和b的互换,但是实际上a和b没有互换。
为什么a和b的值已经传递到test1函数里了,但是值没有互换?

原因就在于,函数Test1里的参数(形式参数),是用来接受数值的
也就是重新创建了一个变量来接收这个值,而不是用原来main函数里的变量a和b。我改变了新创建的变量的值,自然不会影响到原来的变量,所以值没有互换

就算把a1和b1改成a和b,那也是重新创建的变量,函数里的变量是局部变量,只作用在当前函数里(main函数。

那么怎么使这个功能正常,把a和b的值进行互换?
这就要用到地址传递。

案例2:

int main() {
	int a = 10;
	int b = 20;

	test1(&a, &b);
	cout <<  "a = " << a;
	system("pause");

	return 0;
}
void test1(int * a1, int * b1)
{
	int temp = *a1;
	*a1 = *b1;
	*b1= temp;
	cout << "a = " << *a1;
}

还是main函数调用test1,只是传入的值这次变为了&a和&b即a和b的地址。
然后用指针a1和b1来存放a和b的地址。
然后把解引用的值进行互换。发生了真正的互换。

这次为什么互换成功了的原因是:
地址是不变的,当我传递过来的是地址时,拿到这个地址,他所对应的存放的值就拿到了。改变地址所对应的值,就改变了原变量a和b的值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值