先说结论:值传递不改变实参,地址传递改变实参
(小声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的值。