代码之家  ›  专栏  ›  技术社区  ›  jjmcc

在调用函数时,在PTR**和PTR*+C++之间有区别吗?

  •  5
  • jjmcc  · 技术社区  · 7 年前

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

    看起来这两个change函数都可以实现我的要求,但是我不确定有什么不同,除了引用函数不创建指针的副本之外?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Caleth    7 年前

    你可以给第一个 nullptr ,它将编译 1 ,因为存在从 std::nullptr_t int** . 如果你想给第二个 空PTR int* ,但不能将可变引用绑定到临时引用。

    in this answer ,其中还包括对象所有权考虑(使用 std::unique_ptr )

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

        2
  •  1
  •   eerorika    7 年前

    有什么不同。。。在ptr**和ptr*&之间。。。

    对。前者是指针,指向类型为的对象 ptr* ,而后者是对类型为的对象的引用 ptr公司* .

    或首选。。。

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

    参考文献的优点

    您会发现引用是隐式间接的,这使得语法更简单,而且通常有助于可读性。在引用/指针指向指针的情况下,这一点尤为重要。同样的优势也适用于获取引用:您不需要使用operator的地址。

    另一个优点是引用不能被重新分配来引用另一个对象。这使得读取使用引用的程序更简单,因为您不需要弄清楚引用是否在长算法中被重新分配;您知道它不是。

    另一个优点是引用不能为null。因此,您不需要在函数中检查这种可能性。如果将null传递给第一个示例函数,则行为将是未定义的,这是一件非常糟糕的事情。

    您会发现引用是隐式间接的。对于只熟悉值类型的人(C程序员),这可能会让人感到困惑。

    另一个缺点是引用不能为null。这似乎不是一个问题,你的职能,大概从来没有打算处理这种情况。但一般来说,在某些情况下,您需要表示对不存在的对象的引用关系。


        3
  •  0
  •   Bathsheba    7 年前

    这主要是个人品味的问题。

    void change(int** ptr) ,因为你倾向于用 & 能够 由函数修改。如果你使用 int*& ptr 重载时,调用语法与passby value和pass by reference相同,这一点就不那么清楚了。

    nullptr 允许,如果不允许,则引用。