C语言的指针与cpp的引用

指针 vs 引用 的相似之处

共同特点:

  • 都是间接访问:都提供了对另一个对象/变量的间接访问
  • 都避免拷贝:传递大型对象时都可以避免昂贵的拷贝操作
  • 都能修改原对象:通过指针或引用都可以修改所指向的对象

具体代码对比

#include <iostream>
using namespace std;

void pointerExample() {
    int value = 10;
    int* ptr = &value;    // 指针
    int& ref = value;     // 引用
    
    cout << "原始值: " << value << endl;
    
    *ptr = 20;  // 通过指针修改
    cout << "指针修改后: " << value << endl;
    
    ref = 30;   // 通过引用修改
    cout << "引用修改后: " << value << endl;
}

void functionParameters() {
    // 指针作为参数
    void updateWithPointer(int* ptr) {
        if (ptr) *ptr = 100;
    }
    
    // 引用作为参数
    void updateWithReference(int& ref) {
        ref = 200;
    }
    
    int num = 5;
    updateWithPointer(&num);  // 需要取地址
    updateWithReference(num); // 直接传递变量
}

主要区别

特性 指针 引用
语法 *ptr, &var &ref, 直接使用
空值 可以为 nullptr 必须初始化,不能为空
重绑定 可以指向不同对象 一旦绑定不能改变
内存占用 有自己的内存地址 是别名,不占额外内存
数组 支持指针算术 不能重新绑定

使用场景

// 推荐使用引用的场景
void processString(string& str) {  // 修改原字符串
    str += " processed";
}

void printObject(const Object& obj) {  // 避免拷贝,只读访问
    cout << obj << endl;
}

// 推荐使用指针的场景
void optionalParameter(int* optional = nullptr) {
    if (optional) {
        *optional = 42;
    }
}

void dynamicAllocation() {
    int* arr = new int[100];  // 动态内存必须用指针
    // ... 使用 arr
    delete[] arr;
}

现代C++建议

在现代C++中,通常优先考虑使用引用,除非你需要:

  • 处理可选参数(可能为空)
  • 进行动态内存管理
  • 需要重绑定指向不同的对象
  • 与C语言接口交互

引用提供了更安全、更直观的语法,减少了空指针和内存管理的风险。

posted @ 2025-09-29 09:33  光辉233  阅读(10)  评论(0)    收藏  举报