C++ 引用调用:使用指针
提示
- 引用传递和值传递:在C++中,函数参数可以通过值传递(传递实际值)或引用传递(传递变量的引用或地址)。引用传递允许函数直接修改原始变量。
- 使用引用参数的函数:使用引用作为参数的函数(如
void func2(int &numRef) {...}
)实际传递的是变量的地址,而不是变量的值。 - 使用指针实现引用传递:在函数定义中使用指针作为参数(如
void swap(int* n1, int* n2) {...}
)可以实现引用传递,允许函数通过指针直接访问和修改原始变量的值。
在这篇教程中,我们将学习C++中的指针,以及如何通过引用传递参数给函数。指针是用于存储其他变量地址的变量。例如:
// 使用值作为参数的函数
void func1(int numVal) {
// 代码
}
// 使用引用作为参数的函数
// 注意参数前的 &
void func2(int &numRef) {
// 代码
}
int main() {
int num = 5;
// 传值调用
func1(num);
// 传引用调用
func2(num);
return 0;
}
注意 void func2(int &numRef)
中的 &
符号。这表明我们使用变量的地址作为参数。
因此,当我们在 main()
函数中调用 func2()
函数,并将变量 num 作为参数传递时,实际上传递的是 num 变量的地址,而不是值 5。
示例 1:不使用指针的传引用
#include <iostream>
using namespace std;
// 函数定义以交换值
void swap(int &n1, int &n2) {
int temp;
temp = n1;
n1 = n2;
n2 = temp;
}
int main() {
// 初始化变量
int a = 1, b = 2;
cout << "交换前" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
// 调用函数以交换数字
swap(a, b);
cout << "\n交换后" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
输出
交换前
a = 1
b = 2
交换后
a = 2
b = 1
在这个程序中,我们将变量 a 和 b 传递给了 swap()
函数。注意函数定义,
void swap(int &n1, int &n2)
这里,我们使用 &
来表示函数将接受地址作为参数。
因此,当我们在函数中交换 n1 和 n2 时,实际上交换的是变量 a 和 b 的值。
同样的任务也可以使用指针完成。要了解指针的相关信息,请访问 C++ 指针。
示例 2:使用指针传引用
#include <iostream>
using namespace std;
// 函数原型,参数为指针
void swap(int*, int*);
int main() {
// 初始化变量
int a = 1, b = 2;
cout << "交换前" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
// 调用函数,传递变量地址
swap(&a, &b);
cout << "\n交换后" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
// 函数定义以交换数字
void swap(int* n1, int* n2) {
int temp;
temp = *n1;
*n1 = *n2;
*n2 = temp;
}
输出
交换前
a = 1
b = 2
交换后
a = 2
b = 1
在这里,我们可以看到输出与前一个示例相同。注意这行代码,
// &a 是 a 的地址
// &b 是 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 的值时,它们的值已经改变。