📘值传递 vs 引用传递

2026-09-01
⭐⭐ GESP 3级

📖概念讲解

【考点 · 3级】值传递 vs 引用传递 — 函数参数的两种传递方式,属于函数基础。

【说人话】

值传递:函数拿到的是参数的副本,改了副本不影响原变量。就像你复印了一份文件,在复印件上乱涂乱画,原件没事。

引用传递:函数拿到的是原变量的别名,改了就是改了原件。加 & 就是引用传递。

💡 核心易错点:想在函数里修改外部变量的值?必须用引用传递。值传递改了白改!

💻代码示例

1#include <iostream>
2using namespace std;
3
4// 值传递:传的是副本,改了不影响外面
5void swapValue(int a, int b) {
6 int tmp = a; // tmp 是局部副本的交换
7 a = b; // 改的是副本 a
8 b = tmp; // 改的是副本 b
9} // 函数结束,副本销毁,原变量不变!
10
11// 引用传递:加 &,直接操作原变量
12void swapRef(int &a, int &b) { // a、b 是外部变量的别名
13 int tmp = a;
14 a = b; // 直接修改原变量
15 b = tmp; // 直接修改原变量
16}
17
18int main() {
19 int x = 10, y = 20;
20
21 swapValue(x, y); // 值传递:x 和 y 不变
22 cout << "值传递后: " << x << " " << y << endl;
23
24 swapRef(x, y); // 引用传递:x 和 y 真的交换了
25 cout << "引用传递后: " << x << " " << y << endl;
26
27 return 0;
28}
29// 输出:值传递后: 10 20
30// 输出:引用传递后: 20 10

🧩互动小测

❓ 以下哪个函数能真正修改外部变量 n 的值?

❓ 执行下面代码后,a 的值是多少?

void f(int x) { x = 100; }
int a = 5;
f(a); // a = ?

❓ const int & 作为参数有什么作用?

🏋️动手练一练

📝 编程练习

写一个函数 increment(int &val, int times),将 val 加上 times 次(每次 +1),在 main 中调用后输出结果。
要求:必须使用引用传递,不能用全局变量。
提示:参数声明中加 & 即可。
参考答案:
#include <iostream>
using namespace std;

void increment(int &val, int times) {
    for (int i = 0; i < times; i++) {
        val++;  // 引用传递,直接修改原变量
    }
}

int main() {
    int n = 0;
    increment(n, 5);
    cout << n << endl;  // 输出 5
    return 0;
}

要点:参数加 & 就是引用传递。循环 times 次每次 +1,最终 val 增加了 times。

📝易错点提醒

1️⃣ 忘记加 & 就是值传递 — void f(int n) 和 void f(int &n) 天差地别

2️⃣ const 引用不能改值 — const int &n 只能读不能写,适合传大对象又不想被改

3️⃣ 引用必须初始化 — 声明时就要绑定,不能先声明再赋值

4️⃣ 数组不能直接用引用传 — 传数组本质是传指针,不是引用

💡 记忆口诀:想改外面的值 → 加 &;只是读一下 → 不加 & 或 const &。
学完这个知识点后点一下