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++中推荐的参数传递方式。
更多推荐



所有评论(0)