📅  最后修改于: 2020-09-25 05:05:59             🧑  作者: Mango
在C++函数教程中,我们学习了有关将参数传递给函数。所使用的此方法称为“按值传递”,因为传递了实际值。
然而,参数传递到参数的实际值不会传递函数的另一种方式。而是传递对值的引用。
例如,
// function that takes value as parameter
void func1(int numVal) {
// code
}
// function that takes reference as parameter
// notice the & before the parameter
void func2(int &numRef) {
// code
}
int main() {
int num = 5;
// pass by value
func1(num);
// pass by reference
func2(num);
return 0;
}
注意&
in void func2(int &numRef)
。这表示我们正在使用变量的地址作为参数。
因此,当我们通过传递变量num
作为参数在main()
调用func2()
函数时,实际上是在传递num
变量的地址而不是值5 。
#include
using namespace std;
// function definition to swap values
void swap(int &n1, int &n2) {
int temp;
temp = n1;
n1 = n2;
n2 = temp;
}
int main()
{
// initialize variables
int a = 1, b = 2;
cout << "Before swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
// call function to swap numbers
swap(a, b);
cout << "\nAfter swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
输出
Before swapping
a = 1
b = 2
After swapping
a = 2
b = 1
在此程序中,我们将变量a
和b
传递给swap()
函数。注意函数定义,
void swap(int &n1, int &n2)
在这里,我们使用&
表示该函数将接受地址作为其参数。
因此,编译器可以识别出变量的引用被传递给函数参数,而不是实际值。
在swap()
函数, 函数参数n1
和n2
分别指向与变量a
和b
相同的值。因此,交换发生在实际价值上。
使用指针可以完成相同的任务。要了解指针,请访问C++指针。
#include
using namespace std;
// function prototype with pointer as parameters
void swap(int*, int*);
int main()
{
// initialize variables
int a = 1, b = 2;
cout << "Before swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
// call function by passing variable addresses
swap(&a, &b);
cout << "\nAfter swapping" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
// function definition to swap numbers
void swap(int* n1, int* n2) {
int temp;
temp = *n1;
*n1 = *n2;
*n2 = temp;
}
输出
Before swapping
a = 1
b = 2
After swapping
a = 2
b = 1
在这里,我们可以看到输出与前面的示例相同。注意这一行,
// &a is address of a
// &b is address of b
swap(&a, &b);
在此,变量的地址是在函数调用期间传递的,而不是在变量传递时传递的。
由于传递的是地址而不是值,因此必须使用解引用运算符 *
来访问存储在该地址中的值。
temp = *n1;
*n1 = *n2;
*n2 = temp;
*n1
和*n2
给出存储在地址n1
和n2
的值。
由于n1
和n2
包含a
和b
的地址,因此对*n1
和*n2
做任何事情都会改变a
和b
的实际值。
因此,当我们在main()
函数打印a
和b
的值时,这些值会更改。