一、先搞懂:引用到底是什么?

可以把引用理解成变量的“别名”(外号)。就像一个人可以有大名和小名,不管叫哪个名字,指的都是同一个人。

举个生活中的例子:

  • 变量 int a = 10; 就像“张三”(大名)
  • 引用 int &b = a; 就像“小三”(小名)
  • 不管修改 a 还是 b,都是修改同一个内存里的数值。

二、引用的基本语法(0基础也能写)

1. 引用的定义格式

数据类型 &引用名 = 原变量名;
  • & 在这里不是“取地址符”,而是引用符号
  • 引用必须在定义时就初始化(必须立刻绑定到一个变量上,不能先定义再赋值)
  • 引用一旦绑定某个变量,就不能再绑定其他变量(一辈子只认一个“本尊”)

2. 最简单的示例代码

#include <iostream>
using namespace std;

int main() {
    // 1. 定义一个普通变量(本尊)
    int num = 100;
    
    // 2. 定义num的引用(别名)
    int &ref_num = num;  // 注意:&在这里是引用符号,不是取地址
    
    // 3. 打印本尊和别名的数值
    cout << "num的值:" << num << endl;     // 输出:100
    cout << "ref_num的值:" << ref_num << endl;  // 输出:100
    
    // 4. 修改别名,看看本尊会不会变
    ref_num = 200;
    cout << "修改ref_num后,num的值:" << num << endl;  // 输出:200
    
    // 5. 验证:本尊和别名的内存地址完全相同
    cout << "num的地址:" << &num << endl;       // 比如输出:0x7ffeefbff5ac
    cout << "ref_num的地址:" << &ref_num << endl;  // 输出和上面完全一样
    
    return 0;
}

3. 错误示例(新手常踩坑)

#include <iostream>
using namespace std;

int main() {
    // 错误1:引用定义时未初始化
    // int &ref;  // 编译器直接报错:引用必须初始化
    
    // 错误2:引用不能绑定到常量
    // int &ref = 10;  // 报错,常量没有内存地址,无法别名
    
    // 错误3:引用一旦绑定,不能更换绑定对象
    int a = 10;
    int b = 20;
    int &ref = a;
    ref = b;  // 这不是更换绑定!而是把b的值赋给a(ref是a的别名)
    cout << a << endl;  // 输出20,证明a被修改了,ref还是a的别名
    
    return 0;
}

三、引用的核心用途(为什么要用引用?)

引用最常用的场景有两个,都是为了解决实际开发中的问题:

1. 函数参数传递(避免拷贝,提高效率)

如果函数参数是普通变量,会生成一份拷贝(浪费内存);用引用作为参数,直接操作原变量,无拷贝开销。

示例:交换两个整数(用引用实现)

#include <iostream>
using namespace std;

// 引用作为函数参数:直接操作原变量
void swap(int &x, int &y) {
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    int a = 10, b = 20;
    cout << "交换前:a=" << a << ", b=" << b << endl;  // a=10, b=20
    
    swap(a, b);  // 传入变量,函数内直接修改原变量
    
    cout << "交换后:a=" << a << ", b=" << b << endl;  // a=20, b=10
    return 0;
}

对比:如果不用引用(用普通参数),交换会失败(因为修改的是拷贝,不是原变量):

void swap_error(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    int a=10, b=20;
    swap_error(a, b);
    cout << a << "," << b << endl;  // 还是10,20,交换失败
    return 0;
}

2. 函数返回引用(返回变量本身,可链式赋值)

普通函数返回值是“拷贝”,返回引用则返回变量本身,支持链式操作。

示例:返回数组元素的引用

#include <iostream>
using namespace std;

int arr[5] = {1,2,3,4,5};

// 返回数组第n个元素的引用
int &get_arr_element(int n) {
    return arr[n];  // 返回的是arr[n]本身,不是拷贝
}

int main() {
    // 通过返回的引用修改数组元素
    get_arr_element(2) = 99;  // 等价于 arr[2] = 99
    
    cout << arr[2] << endl;  // 输出99
    
    // 链式赋值(引用的特性)
    get_arr_element(0) = get_arr_element(1) = 100;
    cout << arr[0] << "," << arr[1] << endl;  // 输出100,100
    return 0;
}

⚠️ 注意:不能返回函数内局部变量的引用(局部变量在函数结束后会被销毁,引用会变成“野引用”,程序崩溃):

// 错误示例!
int &bad_func() {
    int temp = 10;
    return temp;  // temp是局部变量,函数结束后销毁,引用失效
}

四、引用和指针的简单对比(新手不用深究,先记结论)

很多新手会混淆引用和指针,这里用表格简单区分:

特性 引用(别名) 指针(地址)
定义格式 int &ref = a; int *p = &a;
是否可空 不可空(必须绑定变量) 可以为空(int *p = nullptr;
是否可重绑定 一旦绑定不能改 可以指向不同变量
使用方式 直接用(和变量一样) 需要解引用(*p

新手结论:能用引用就先用引用,语法更简单、更安全(不会有空指针问题)。

总结

  1. 引用是变量的别名,和原变量共享同一块内存,修改引用就是修改原变量;
  2. 引用必须定义时初始化,且一旦绑定就不能更换绑定对象;
  3. 引用的核心用途是函数参数传递(避免拷贝、修改原变量)和函数返回引用(返回变量本身),是C++中提高效率和代码简洁性的重要工具。

如果看完还有不懂的地方(比如const引用、引用的底层实现),可以告诉我,我再针对性讲解~

1 条评论

  • @ 2026-1-26 10:03:23
    #include<iostream>
    using namespace std;
    // 引用作为函数参数:直接操作原变量
    
    void f(const int &x) {
    	cout<<x*2<<endl;
    }
    int main() {
    	int a = 100;
    	f(a);
    	return 0;
    }
    
    • 1