函数中参数是如何传递的呢?
在《C++Primer》一书中提到:
“Each time we call a function, its parameters are created and initialized by the arguments passed in the call。”(每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。)
可能会有点模糊,说白了就是在调用函数时,如果函数中有参数,则函数中的参数会先被创建出来,然后把传入函数的实参的值一一赋值给你所创建的参数,而这个你所创建的参数就是上面所说的形参。
理解函数中的参数的传递也是挺重要的,这也有助于你在实现函数的这类方法的时候灵活得到应用。
关于函数的传递,其它的不多说,这里我们就来处理一个问题就行了,这问题如下:
通过函数来改变现有实参的值。
感觉好像很简单,其实这当中如果你不了解其中参数传递的本质,可能会处理不好这个问题。
举个简单的例子,看以下代码:
#include<iostream>
using namespace std;
void Swap(int a, int b){
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a = 1, b = 2;
cout << "交换前:" << endl;
cout << "a = " << a << "\t" << "b = " << b << endl;
Swap(a, b);
cout << "交换后:" << endl;
cout << "a = " << a << "\t" << "b = " << b << endl;
<span style="white-space:pre"> </span>return 0;
}
这里尝试着两个int型的变量值进行交换,结果如下:
如果我们想对两个int型变量的值进行交换,Swap函数并不可以实现真正的交换。为什么?函数体里不是实现了交换了吗?是的,的确是进行交换了,但是交换的是实参的拷贝。
上面一开始就有提到,函数被调用时,函数形参被创建并赋值为实参的值。但是这并不会影响实参现有的值,即实参值保持不变。
所以这里如果要进行真正值得交换,有很多方法,比如形参作为引用再把实参传入:
void Swapanother(int &a, int &b){
int temp;
temp = a;
a = b;
b = temp;
}
调用如下:
Swapanother(a, b);
或是形参作为指针,把实参地址传入:
void Swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
调用如下:
Swap(&a, &b);
这两种方法都可以改变实参的值,结果如下:
总结:
1.调用函数时函数中的参数会先另外创建出来,然后再其赋予对传入实参的值。
2.修改传入实参的值可以通过形参引用或者指针传址的方式修改。