C++ ptr**和ptr*&;之间是否存在差异或首选;在C++;调用函数的时候?

C++ ptr**和ptr*&;之间是否存在差异或首选;在C++;调用函数的时候?,c++,pointers,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 =

改变函数中的指针有什么不同或首选的方法吗?以这个片段为例

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

    }
void变更(int**ptr){
**ptr=50;
*ptr=nullptr;
}
无效更改(int*&ptr){
*ptr=50;
ptr=nullptr;
}
int main()
{
INTA=5;
int*ptr=&a;
int**ptr2=&ptr;

这在很大程度上是个人品味的问题

也就是说,当调用
void change(int**ptr)
时,由于您倾向于使用
&
传递某物的地址,因此在调用站点上,“某物”的可以由函数修改。如果使用
int*&ptr
重载,则调用语法与按值传递和按引用传递完全相同,因此不太清楚


除上述内容外,如果允许
nullptr
,我倾向于使用指针作为函数参数,如果不允许,则使用引用。

可以使用空指针,但不能使用空引用

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

我讨论了不同参数传递方式的各种情况,其中还包括对象所有权方面的考虑(使用
std::unique\u ptr

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

ptr**和ptr*&…之间有区别吗

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

或者更喜欢

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

void change(int*& ptr) {
    *ptr = 50;
    ptr = nullptr;
}
参考书的优点

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

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

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

参考书的缺点

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

另一个缺点是无法重新分配引用以引用另一个对象。这对函数来说似乎不是问题,因为您不需要引用多个对象,但一般来说,在某些情况下它会很有用

另一个缺点是引用不能为null。这似乎对您的函数来说不是问题,您的函数可能从未打算处理这种情况。但一般来说,在某些情况下,您希望表示对不存在对象的引用关系



偏好是个人的,但在我看来,参考的优点大于缺点,除非您需要一个不可能的特性(可空性、重新分配)指针函数指针不复制<代码> PTR>代码>。在C++中,最好不要使用原始的Posits,性能没有差别,引用是指针中的指针。end@user2176127“仿佛”规则将是一个更好的引用,因为在性能上没有差异。引用不必实现为指针,指针有时可以“取消引用”由编译器命名一个类型;
ptr**
是指向该类型的指针,
ptr*&
是对该类型的引用。这个问题与询问
int*
int&
之间的区别完全相同。