4.在传递函数参数时,什么时候该使用指针,什么时候该使用引用呢?
4.在传递函数参数时,什么时候该使用指针,什么时候该使用引用呢?
一句话总原则
- 需要 “可选”、需要 “空”、需要修改指向 → 用指针
- 参数一定存在、不想空、语法更简洁 → 用引用
一、该用「指针」的场景
满足下面任意一条,就用指针:
1. 参数可以为空(nullptr)
引用不能为空,指针可以。
void func(int* p) {
if (p) { // 可以判断是否为空
// ...
}
}
2. 需要修改指针本身(让它指向别的对象)
void reset(int*& p); // 指针的引用
void reset(int** p); // 二级指针
引用做不到这一点。
3. 需要指向数组、需要做指针运算
void print(int* arr, int len);
4. 兼容 C 接口、底层库、内存操作
比如 malloc、free、文件操作、系统调用等。
5. 想表达 “所有权转移 / 指向关系”
比如链表、树结构里存节点:
struct Node {
int val;
Node* next; // 这里不能用引用
};
二、该用「引用」的场景
满足下面任意一条,优先用引用(尤其是 const &)
1. 参数一定有效,不允许为空
引用从语法上保证不为空,更安全。
2. 不想写 *,想简洁、像普通变量一样用
void func(int& a) {
a = 10; // 不用解引用 *
}
3. 传递大对象,避免拷贝(最常用!)
void print(const string& s); // 推荐
void print(string s); // 不推荐,会拷贝
4. 函数需要修改实参
void swap(int& a, int& b);
比指针更清爽。
5. 运算符重载、返回自身对象
ostream& operator<<(ostream& os, ...);
三、最强记忆口诀(面试直接背)
- 能空、能改指向、数组、底层 → 指针
- 必存在、不拷贝、改参数、简洁 → 引用
- 只读传参优先 const T&(最常用、最安全)
四、最实用的默认规则(写代码直接照这个来)
- 普通小类型(int、double…)→ 直接值传递
- 大对象(string、vector、自定义类)→ const 引用:const T&
- 需要修改实参→ T&
- 参数可有可无→ T 或 optional
- 数据结构存节点 / 关系→ T或智能指针

浙公网安备 33010602011771号