方法调用过程中,有值传递和址传递两种形式。如果在原有数据上进行操作,值传递不会改变原有数据的值,而址传递会改变原有数据的值。下面以交换两个数值为例,讲述值传递和址传递的区别。
1.值传递
int main()
{
int a = 10;
int b = 20;
//值传递
swap1(a, b);
cout << "main 中: a的值=" << a << endl;
cout << "main 中: b的值=" << b << endl;
system("pause");
return 0;
}
void swap1(int num1, int num2) {
int temp = num1;
num1 = num2;
num2 = temp;
cout << " swap1 中: num1的值=" << num1 << endl;
cout << " swap1 中: num2的值=" << num2 << endl;
}
结果
swap1 中: num1的值=20
swap1 中: num2的值=10
main 中: a的值=10
main 中: b的值=20
2.址传递
int main()
{
int a = 10;
int b = 20;
//址传递
swap2(a, b);
cout << "main 中: a的值=" << a << endl;
cout << "main 中: b的值=" << b << endl;
system("pause");
return 0;
}
void swap2(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
cout << " swap2 中: a的值=" << *p1 << endl;
cout << " swap2 中: b的值=" << *p2 << endl;
}
结果
swap2 中: a的值=20
swap2 中: b的值=10
main 中: a的值=20
main 中: b的值=10
以内存形式进行分析,从下图可以看出,值传递方法swap1中,新建了两个变量num1和num2,这两个值相当于源数据a和b的备份,执行swap1方法是在操作"备份"的数据,对源数据无影响。而址传递方法swap2中,新建的指针p1和p2保存的是源数据的地址,执行swap2方法是通过指针操作源数据a和b,对源数据有影响。