在调用函数时,ptr**和ptr*之间是否存在差异,或者在C++中是否存在差异?

jjm*_*mcc 5 c++ pointers

是否有改变函数中指针的差异或首选方法?以此片段为例

    void change(int** ptr) {
        **ptr = 50;
        *ptr = nullptr;
    }

    void change(int*& ptr) {
        *ptr = 50;
        ptr = nullptr;
    }

    int main()
    {
        int a = 5;

        int* ptr = &a;
        int** ptr2 = &ptr;

        std::cout << "value: " << a << std::endl;
        std::cout << "value: " << ptr << std::endl;
        std::cout << "value: " << ptr2 << std::endl;

        change(ptr2);
        //change(ptr);

        std::cout << "value: " << a << std::endl;
        std::cout << "value: " << ptr << std::endl;
        std::cout << "value: " << ptr2 << std::endl;


        system("pause");

    }
Run Code Online (Sandbox Code Playgroud)

似乎两个更改函数都可以实现我所要求的,但我不确定区别,除了引用函数不创建指针的副本?

Cal*_*eth 3

可以有空指针,但不能有空引用。

您可以提供第一个nullptr,它将编译1,因为存在从std::nullptr_t到 的隐式转换int**。如果您尝试为第二个提供nullptr,它将失败。最好的匹配是转换std::nullptr_tint*,但您不能将可变引用绑定到临时引用。

我在这个答案中讨论了参数传递的不同方式的各种情况,其中还包括对象所有权注意事项(与std::unique_ptr

1. 该行为将是未定义的,因为您取消引用它。