簡體   English   中英

在調用函數時,ptr **和ptr *之間是否存在差異,或者在C ++中是否存在差異?

[英]Is there a difference, or preferred between ptr** and ptr*& in C++ when calling functions?

是否有改變函數中指針的差異或首選方法? 以此片段為例

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

    }

似乎兩個更改函數都可以實現我所要求的,但我不確定區別,除了引用函數不創建指針的副本?

您可以使用空指針,但不能使用空引用。

您可以使用nullptr提供第一個,並且它將編譯1 ,因為存在從std::nullptr_tint**的隱式轉換。 如果您嘗試使用nullptr提供第二個,它將失敗。 最好的匹配是將std::nullptr_t轉換為int* ,但是您不能將可變引用綁定到臨時。

在這個答案中討論了不同的參數傳遞方式的各種情況,其中還包括對象所有權注意事項(使用std::unique_ptr

1.行為將是未定義的,因為您取消引用它。

ptr **和ptr之間是否有區別*&...

是。 前者是指向ptr*類型的對象的指針,而后者是對ptr*類型的對象的引用。

或者首選......

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

參考的優點

您會發現該引用是隱式間接的,這使得語法更簡單,並且通常有助於提高可讀性。 在指向指針的引用/指針的情況下,這尤其重要。 同樣的優勢適用於獲取引用:您不需要使用address-of運算符。

另一個優點是不能重新分配引用以引用另一個對象。 這使得讀取使用引用的程序變得更加簡單,因為您不需要弄清楚是否在長算法中重新分配了引用; 你知道事實並非如此。

另一個優點是引用不能為空。 因此,您無需在函數中檢查此類可能性。 如果將null傳遞給第一個示例函數,則行為將是未定義的,這是一件非常糟糕的事情。

參考的缺點

您會發現該引用是隱式間接的。 對於只熟悉價值類型(C程序員)的人來說,這可能會讓人感到困惑。

另一個缺點是不能重新分配引用以引用另一個對象。 這對您的函數來說似乎不是問題,因為您不需要引用多個對象,但通常情況下,它會有用。

另一個缺點是引用不能為空。 對於您的功能而言,這似乎不是問題,而這可能無法用於處理此類情況。 但總的來說,在某些情況下,您希望表示與不存在的對象的引用關系。


偏好是個人的,但在我看來,參考的優點超過了缺點,除非你需要一個不可能的功能(可空性,重新分配)

這主要取決於個人品味。

這就是說,當調用void change(int** ptr)因為你往往通不過的東西使用的地址& ,它是在調用現場的“東西” 可以通過函數修改清晰。 如果你使用int*& ptr重載,它就不像調用語法對於pass-by-value和pass-by-reference一樣清晰。

除了上面的內容之外,如果允許nullptr ,我傾向於使用指針作為函數參數,如果不允許則使用引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM