簡體   English   中英

指針指針與指針指針(C ++)之間的區別

[英]Difference between pointer-to-pointer vs reference-to-pointer (C++)

我有一些使用接口指針的COM代碼。 代碼的原作者實現了返回接口指針的函數,如下所示:

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator ); // (1)

而不是傳統的

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject** ppEnumerator ); // (2)

函數(1)被調用如下:

hRes = Query ( sQuery, pEnumerator ); // (3)

這肯定看起來不對,但它工作正常。 我不確定我是否只是拿起這一行,因為out參數不是指向輸出變量的指針,或者因為這種方法有問題。

使用引用指針而不是指針指向輸出參數是否有優勢?

優點與使用引用而不是指針相同:

  • 簡單
  • 引用不能為null,因此在Query分配引用不會導致訪問沖突

請注意,原始描述有誤: IEnumWbemClassObject* &是對指針的引用,而不是對引用的指針。

第一個例子是對指針引用 ,即。 IEnumWbemClassObject*類型的引用:

HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator );

因此,如果將pEnumerator聲明為IEnumWbemClassObject* (我假設它是),則不需要將pEnumerator的地址顯式傳遞給函數或取消引用函數內部的變量,以便更改pEnumerator指向的位置(否則將需要IEnumWbemClassObject**的參數IEnumWbemClassObject** )。

對指針的引用與對任何其他類型的引用具有相同的行為,只需將上述示例視為“對指針的引用”不是 “指向 引用的指針” 沒有指向引用的指針。

最好將Type &foo *視為對指針的引用而不是相反的方式,因為它不再暗示您可以通過指針和其他類似的C ++修改引用。 它還使得函數調用更容易相信,因為它就像通過引用傳遞任何其他內容一樣,不需要解除引用或特殊符號。

因為指針和引用在普通的c ++實現中表示相同(這是實現細節,但不是標准的一部分。也是它對指針的引用,而不是引用的指針,你不能創建指向引用的指針。

暫無
暫無

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

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