C++中指针传递与引用传递的区别
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. 实际使用中的区别
空指针问题:
- 指针传递:可以传递
nullptr
,需在函数内检查 - 引用传递:不能传递
nullptr
,总是引用有效对象
- 指针传递:可以传递
修改能力:
- 指针:可以修改指针本身(让它指向其他地址)
- 引用:不能修改引用(只能修改引用指向的值)
代码可读性:
- 指针:需记住用
*
解引用,容易出错 - 引用:直接使用变量名,更直观
- 指针:需记住用
5. 简单总结
特性 | 指针传递 | 引用传递 |
---|---|---|
本质 | 传递地址 | 传递别名 |
语法 | Type* | Type& |
是否可以为NULL | 可以 | 不可以 |
是否可以修改指向 | 可以 | 不可以 |
代码可读性 | 较低 | 较高 |
关键区别:指针传递是"传递一个地址",引用传递是"传递一个别名"。虽然两者都与地址相关,但语义完全不同。引用传递更安全、更直观,是C++中推荐的参数传递方式。