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 接口、底层库、内存操作

比如 mallocfree、文件操作、系统调用等。

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, ...);

三、最强记忆口诀(面试直接背)

  1. 能空、能改指向、数组、底层 → 指针
  2. 必存在、不拷贝、改参数、简洁 → 引用
  3. 只读传参优先 const T&(最常用、最安全)

四、最实用的默认规则(写代码直接照这个来)

  • 普通小类型(int、double…)→ 直接值传递
  • 大对象(string、vector、自定义类)→ const 引用:const T&
  • 需要修改实参→ T&
  • 参数可有可无→ T 或 optional
  • 数据结构存节点 / 关系→ T或智能指针
posted @ 2023-07-03 21:11  CodeMagicianT  阅读(755)  评论(0)    收藏  举报