引用和指针是 C++ 中两种重要的机制,用于间接访问和操作对象。它们有相似之处,但也有显著的区别。以下是对引用和指针的详细对比和解释:
1. 基本概念
指针(Pointer)
- 指针是一个变量,存储的是另一个对象的内存地址。
- 指针可以为空(
nullptr),表示不指向任何对象。 - 指针需要通过 -> 访问成员
引用(Reference)
- 引用是变量的别名,操作引用相当于操作原变量。
- 引用必须在声明时初始化,且不能改变其绑定的对象。
- 引用传递避免了拷贝开销,适合传递较大的对象。
void setCard(Card &card);
使用场景
当你希望函数直接修改传入的对象时,使用引用。
Card myCard;
setCard(myCard); // 直接修改 myCard
注意事项
如果不需要修改传入的对象,可以使用 const 引用:
void setCard(const Card &card);
2. 语法对比
指针
- 声明指针:
int *p; - 获取地址:
int x = 10; p = &x; // p 指向 x 的地址 - 解引用指针:
*p = 20; // 修改 x 的值为 20
引用
- 声明引用:
int x = 10; int &r = x; // r 是 x 的引用 - 使用引用:
r = 20; // 修改 x 的值为 20
3. 主要区别
| 特性 | 指针 (*) |
引用 (&) |
|---|---|---|
| 初始化 | 可以不初始化(但建议初始化为 nullptr) |
必须在声明时初始化 |
| 空值 | 可以为 nullptr |
不能为空,必须绑定到有效对象 |
| 重新绑定 | 可以指向不同的对象 | 不能重新绑定,始终指向初始对象 |
| 内存地址 | 指针本身占用内存(存储地址) | 引用不占用额外内存(是别名) |
| 访问成员 | 使用 ->(如 p->doSomething()) |
使用 .(如 r.doSomething()) |
| 安全性 | 可能为空或悬空,需要检查 | 始终有效,无需检查 |
| 用途 | 动态内存管理、多态、可选参数 | 避免拷贝、函数参数传递 |

最低0.47元/天 解锁文章
590

被折叠的 条评论
为什么被折叠?



