[英]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_t
到int**
的隱式轉換。 如果您嘗試使用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.