C++ 引用 - SomeType* &val 与 SomeType* val

标签 c++ pointers pass-by-reference

我正在解决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!
};

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

最佳答案

如果你这样做

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

关于C++ 引用 - SomeType* &val 与 SomeType* val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70115227/

相关文章:

c++ - 多维数组初始化,Initialized with declaration 和Initialize after declaration有什么区别?

c - C 中的指针及其值

C运算符+=序列点?

ruby - ruby 如何与数组的数组一起工作

JavaScript:闭包是否可以通过值而不是像 PHP 那样通过引用来访问封闭范围内的变量?

c++ - 实例化一个模板类 <erroneous-expression>?

java - 无法使用JNI从java调用C++的成员函数

c++ - 传递值作为对构造函数/函数的引用

c - "segmentation error (core dumped)"使用函数和指针

php - 在 PHP 中如何通过引用传递可变参数函数的参数?