在C++中用三种给函数传递参数的方式,分别是:值传递、指针传递、引用传递。以下就用最简单的swap函数来进行讲解。
一、值传递
#include <iostream>
using namespace std;
int swap(int, int);
int main() {
int a = 10, b =20;
cout << "before:a=" << a << endl;
cout << "before:b=" << b << endl;
swap(a, b);
cout << "after:a=" << a << endl;
cout << "after:b=" << b << endl;
}
int swap(int a, int b) {
int c;
c = a;
a = b;
b = c;
}
从上面代码的运行结果可知,变量a,b的值并没有发生交换,这是为什么呢?
在函数swap调用之前,实参a,b已经有了自己的内存空间并且有各自的值。在swap函数被调用后,为形参分配了各自的空间,并且把main函数中a,b的值复制一份分别复制给形参,在swap函数中进行两值的交换并不会影响到main函数中变量的值。这种传递方式叫做引用传递。
二、指针传递
#include <iostream>
using namespace std;
int swap(int*, int*);
int main() {
int a = 10, b = 20;
int* p1 = &a;
int* p2 = &b;
cout << "before:a=" << a << endl;
cout << "before:b=" << b << endl;
swap(p1, p2);
cout << "after:a=" << a << endl;
cout << "after:b=" << b << endl;
}
int swap(int* a, int* b) {
int c;
c = *a;
*a = *b;
*b = c;
return 0;
}
从上面代码可知,a,b变量的值经过swap函数的操作发生了值的交换。
这就是一个最基本的指针引用,将指针作为函数的参数可以让函数对指针指向的变量的值进行操作。具体指针的知识在此不做过多的赘述。
三、引用传递
#include <iostream>
using namespace std;
void swap(int&, int&);
int main() {
int a = 10;
int b = 20;
int &c = a;
cout << "a:" << &a << endl;
cout << "c:" << &c << endl;
cout << "before:a=" << a << endl;
cout << "before:b=" << b << endl;
swap(a, b);
cout << "after:a=" << a << endl;
cout << "after:b=" << b << endl;
}
void swap(int &a, int &b) {
int c = a;
a = b;
b = c;
}
从上述代码运行结果可以知道,引用其实就是变量的一个别名,在内存中代表着同一块区域;而且当函数未调用之前,实参a,b的值分别是10和20。在函数调用的过程中,形参的值发生了交换,结束后实参的值被修改。即函数调用时,作为形参的的引用变量并不分配新的内存空间,它将作为实参变量的别名与其公用内存。