函数中的数值传递分为值传递和地址传递。
- 值传递是单纯的复制,修改的只是形参。
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "swap a = " << a << endl;
cout << "swap b = " << b << endl;
}
- 地址传递是由形参复制实参的地址,通过解引用的方式访问这个地址,修改后得到的是实参地址上的数据,也就是通过地址传递是可以修改实参的。
void swap_ptr(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
cout << " swap *p1 = " << *p1 << endl;
cout << "swap *p2 = " << *p2 << endl;
}
在main函数中进行交换:
int A = 10;
int B = 20;
cout << "交换前A = " << A << endl;
cout << "交换前B = " << B << endl;
swap(A, B);
cout << "main函数中A = " << A << endl;
cout << "main函数中B = " << B << endl;
swap_ptr(&A, &B);
cout << "main函数中A = " << A << endl;
cout << "main函数中B = " << B << endl;
显然值传递并没有更改A、B实参,而地址传递更改了A、B实参。
地址传递的优点:
值传递会将形参拷贝,如果数据量非常大,比如一个结构体内包含很多信息,当结构体作为形参进行值传递时,系统首先需要对其进行拷贝,这样就会占用大量的内存空间。而地址传递则没有这种问题,地址传递会将地址形参拷贝,解引用后对地址上的数值进行修改,不会有占用大量无意义内存的问题。
使用常量指针防止地址传递可能带来的误操作:
当使用地址传递时,如果不小心修改了地址上的值,是会对程序中的实参造成影响的。那么如何避免这种误操作?显然,我们可以使用常量指针来限制形参不可改变地址对应的值,那么就可以避免这种误操作了。