C++ 引用传参与指针传参:交换变量值的实战对比
C++ 引用传参与指针传参:交换变量值的实战对比
本指南通过交换两数值的经典案例,对比 C++ 引用与指针两种传参方式的语法差异、底层机制及适用场景。
C++ 函数默认按值传参:函数接收原数据的副本。这保护了原变量,但对大型对象效率低,且无法修改调用者数据。
引用传参解决了这两个问题:函数接收原变量的引用(别名),可直接操作原数据。C++ 提供两种等价方式:引用语法与原始指针。掌握两者能让你更灵活地处理内存。
// 按值传参
void func1(int numVal) { /* ... */ }
// 按引用传参(C++ 引用语法)
void func2(int &numRef) { /* ... */ }
int main() {
int num = 5;
func1(num); // 传值:传递副本
func2(num); // 传引用:传递地址,可修改原变量
return 0;
}
void func2(int &numRef) 中的 & 标记参数为引用。调用时传递的是 num 的地址,函数内部可直接修改 num。

示例 1:使用 C++ 引用交换两数
#include <iostream>
using namespace std;
// 使用引用参数的交换函数
void swap(int &n1, int &n2) {
int temp = n1;
n1 = n2;
n2 = temp;
}
int main() {
int a = 1, b = 2;
cout << "Before swapping\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
swap(a, b);
cout << "\nAfter swapping\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
return 0;
}
输出
Before swapping a = 1 b = 2 After swapping a = 2 b = 1
swap 接收两个引用参数。n1、n2 是 a、b 的别名,函数内修改直接影响原变量。
示例 2:使用指针交换两数
#include <iostream>
using namespace std;
// 函数原型使用指针
void swap(int*, int*);
int main() {
int a = 1, b = 2;
cout << "Before swapping\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
// 传递地址
swap(&a, &b);
cout << "\nAfter swapping\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
return 0;
}
// 使用指针的交换函数
void swap(int* n1, int* n2) {
int temp = *n1;
*n1 = *n2;
*n2 = temp;
}
输出
Before swapping a = 1 b = 2 After swapping a = 2 b = 1
此处 swap 接收原始指针,通过解引用 * 访问并修改地址处的值。效果与引用版本相同,但指针语法显式暴露了地址传递。
选择建议: 引用语法更安全、简洁,适合大多数场景;指针提供显式内存控制,动态分配、可选参数(可传 nullptr)等场景必须使用指针。
C语言