1. 指针传递与引用传递的本质区别

指针传递

  • 传递的是指针变量(存储内存地址的变量)
  • 函数内部需用*解引用才能修改原始数据
  • 指针本身可以被修改(如指向其他地址)
  • 可以传递nullptr(空指针)

引用传递

  • 传递的是原始变量的别名(不是地址)
  • 函数内部直接操作原始变量,无需解引用
  • 引用一旦绑定,不能重新绑定到其他变量
  • 不能传递nullptr(总是引用有效对象)

2. 语法上的关键区别

指针传递

void func(int* p) { 
    *p = 10; // 修改指针指向的值
    p = nullptr; // 修改指针本身
}
// 调用:int a = 5; func(&a);

引用传递

void func(int& r) { 
    r = 10; // 直接修改原始变量
    // r = nullptr; // 错误:引用不能设为nullptr
}
// 调用:int a = 5; func(a);

3. 为什么说它们不是"都是地址传递"

  • 指针传递:传递的是"地址的地址"(指针变量本身存储了地址)
  • 引用传递:传递的是"别名",不是地址。引用是原始变量的直接别名,没有额外的地址层级

4. 实际使用中的区别

  1. 空指针问题

    • 指针传递:可以传递nullptr,需在函数内检查
    • 引用传递:不能传递nullptr,总是引用有效对象
  2. 修改能力

    • 指针:可以修改指针本身(让它指向其他地址)
    • 引用:不能修改引用(只能修改引用指向的值)
  3. 代码可读性

    • 指针:需记住用*解引用,容易出错
    • 引用:直接使用变量名,更直观

5. 简单总结

特性 指针传递 引用传递
本质 传递地址 传递别名
语法 Type* Type&
是否可以为NULL 可以 不可以
是否可以修改指向 可以 不可以
代码可读性 较低 较高

关键区别:指针传递是"传递一个地址",引用传递是"传递一个别名"。虽然两者都与地址相关,但语义完全不同。引用传递更安全、更直观,是C++中推荐的参数传递方式。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐