跳到主要内容

C++ 引用调用:使用指针

提示
  1. 引用传递和值传递:在C++中,函数参数可以通过值传递(传递实际值)或引用传递(传递变量的引用或地址)。引用传递允许函数直接修改原始变量。
  2. 使用引用参数的函数:使用引用作为参数的函数(如 void func2(int &numRef) {...})实际传递的是变量的地址,而不是变量的值。
  3. 使用指针实现引用传递:在函数定义中使用指针作为参数(如 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 的值时,它们的值已经改变。