【问题标题】:C++ Reference - SomeType* &val vs. SomeType* valC++ 参考 - SomeType* &val 与 SomeType* val
【发布时间】:2022-01-03 23:21:06
【问题描述】:

我正在解决 LeetCode 783. BST 节点之间的最小距离,我注意到正确解决方案和错误解决方案之间的区别是我的函数调用中的参考 (&) ,如下:

正确的解决方案:

class Solution {
public:
    void traverse(TreeNode* root, TreeNode* &curr, int &sol){
        if (root == nullptr) return;
        traverse(root->left, curr, sol);        
        if(curr) sol = min(sol, abs(root->val - curr->val));
        curr = root;
        traverse(root->right, curr, sol);
    }

    int minDiffInBST(TreeNode* root) {
        int sol = INT_MAX;
        TreeNode* curr = nullptr;
        traverse(root, curr, sol);
        return sol;
    }
};

不正确的解决方案:

class Solution {
public:
    void traverse(TreeNode* root, TreeNode* curr, int &sol){
        //Exactly the same as above!
};

作为一名学生,这是我第一次遇到这种与指针和引用有关的案例。对于这种差异的任何解释,我将不胜感激。

【问题讨论】:

  • 这不是极端情况。分配给函数的非引用参数在该函数之外没有任何影响。指针没有什么特别之处。
  • 不要与指针混淆。将其视为与 int solint& sol 之间的相同区别
  • 当您使用“正确”解决方案调用s.traverse(r, c, sol) 时,它将对变量c 进行操作,而不是对其副本进行操作。因此,当函数返回时,c 将包含 traverse 存储在此变量中的最后一个值(如果有)。
  • 在一种情况下,您传递的是TreeNode 的地址。在另一个中,您传递对一个对象的引用,该对象的值是TreeNode 的地址。
  • 区别与intint&之间的区别完全一样

标签: c++ pointers pass-by-reference


【解决方案1】:

如果你这样做

void foo(int * inner_ptr) {
   ptr++;
}

int main() {
   int arr[5] = {1, 2, 3, 4, 5};
   int outer_ptr = &arr[1];
   foo(outer_ptr);
}

outer_ptr 仍将等于 &arr[1]

您只更改了inner_ptr,即outer_ptr副本

你可以改变它指向的东西。

void foo(int * inner_ptr) {
   (*ptr) = 42;
}

但不是outer_ptr 本身

因此您需要此签名:(带参考)

void foo(int * & inner_ptr);

或此签名:(指向指针的指针)(在这种情况下,您将在函数体中以不同的方式使用它)

void foo(int * * inner_ptr);

【讨论】:

    【解决方案2】:

    答案是,没有引用 (void traverse(TreeNode* root, TreeNode* curr, int &sol){...}) curr 的值将不会为函数的未来调用更新(将从调用堆栈中执行)。

    但是当有一个引用 (void traverse(TreeNode* root, TreeNode* &curr, int &sol){...}) curr 值将被更新并用于下一次调用,直到程序终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2023-01-10
      • 2021-04-18
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多