指针对指针与引用对指针的区别(c++)

Difference between pointer-to-pointer vs reference-to-pointer (C++)

本文关键字:指针 c++ 引用 区别      更新时间:2023-10-16

我有一些使用接口指针的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参数不是一个指向输出变量的指针,还是因为这种方法有问题。

对于我们的形参使用引用到指针而不是指针到指针有什么好处吗?

第一个例子是对指针的引用,即:对类型IEnumWbemClassObject*的引用:

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

因此,如果pEnumerator被声明为IEnumWbemClassObject*(我假设它是),您不需要显式地将pEnumerator的地址传递给函数或解引用函数内的变量,以改变pEnumerator点的位置(否则需要使用IEnumWbemClassObject**的参数)。

对指针的引用与对任何其他类型的引用具有相同的行为,只需将上面的示例视为"对指针的引用",而不是"指向引用的指针"。不存在指向引用的指针

其优点与使用引用代替指针相同:

    简单
  • 引用不能为空,所以在Query中给引用赋值不会导致访问冲突

注意原来的描述有误:IEnumWbemClassObject* &是指向指针的引用,而不是指向引用的指针。

最好考虑Type&foo*作为对指针的引用,而不是反过来,因为它不再意味着你可以通过指针修改引用和其他类似的破坏c++的想法。它还使函数调用更容易相信,因为它就像通过引用传递其他任何东西一样,不需要解引用或特殊符号。

这是因为指针和引用在正常的c++实现中表示相同(这是实现细节,但不是标准的一部分)。而且它是指向指针的引用,而不是指向引用的指针,所以根本不允许创建指向引用的指针。