跳转到内容

C++ 引用vs 指针

来自代码酷

C++引用VS指针[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

在C++中,引用(Reference)和指针(Pointer)都是间接访问变量的机制,但它们有不同的语法、行为和使用场景。理解它们的区别对于编写高效、安全的C++代码至关重要。

  • 引用是变量的别名,必须在声明时初始化,且不能重新绑定到其他变量。
  • 指针是一个存储内存地址的变量,可以重新指向不同的地址,也可以为`nullptr`。

基本语法对比[编辑 | 编辑源代码]

引用[编辑 | 编辑源代码]

int x = 10;
int& ref = x;  // ref是x的引用
ref = 20;      // 修改ref等同于修改x

指针[编辑 | 编辑源代码]

int x = 10;
int* ptr = &x; // ptr存储x的地址
*ptr = 20;     // 通过指针修改x的值
ptr = nullptr; // 指针可以置空

关键区别[编辑 | 编辑源代码]

引用与指针对比
特性 引用 指针
必须初始化 | 可以不初始化
不能重新绑定 | 可以重新指向
不能为`nullptr` | 可以为`nullptr`
通常不占用额外内存(编译器优化) | 占用指针大小的内存(如4/8字节)
自动解引用 | 需显式使用`*`或`->`

内存模型[编辑 | 编辑源代码]

指针
x: 10
ptr
引用
ref
x: 10

实际应用场景[编辑 | 编辑源代码]

函数参数传递[编辑 | 编辑源代码]

引用更安全,适合不需要重新绑定的场景:

void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

指针更灵活,适合可能为空的场景:

void print(int* ptr) {
    if (ptr) cout << *ptr; // 检查空指针
}

返回值优化[编辑 | 编辑源代码]

引用常用于运算符重载:

class Vector {
    int data[100];
public:
    int& operator[](size_t index) { 
        return data[index]; 
    }
};

高级主题[编辑 | 编辑源代码]

引用折叠(C++11)[编辑 | 编辑源代码]

在模板和`auto`推导中涉及引用折叠规则: T& &  T&T& &&  T&T&& &  T&T&& &&  T&&

指针算术[编辑 | 编辑源代码]

指针支持算术运算,引用不支持:

int arr[3] = {1, 2, 3};
int* p = arr;
p++; // 指向arr[1]

性能考虑[编辑 | 编辑源代码]

在大多数情况下,引用和指针的底层实现相同,但引用:

  • 可能被编译器优化掉
  • 没有空值检查开销
  • 语法更简洁

总结[编辑 | 编辑源代码]

  • 优先使用引用:当不需要重新绑定/null语义时
  • 必须使用指针:当需要动态内存管理或可选参数时
  • 现代C++中,引用和智能指针(如`std::unique_ptr`)的组合可以替代许多原始指针的使用场景