指针对指针与引用对指针的区别(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参数不是一个指向输出变量的指针,还是因为这种方法有问题。
对于我们的形参使用引用到指针而不是指针到指针有什么好处吗?
第一个例子是对指针的引用,即:对类型IEnumWbemClassObject*
的引用:
HRESULT Query ( IN BSTR sQuery, OUT IEnumWbemClassObject* &pEnumerator );
因此,如果pEnumerator
被声明为IEnumWbemClassObject*
(我假设它是),您不需要显式地将pEnumerator
的地址传递给函数或解引用函数内的变量,以改变pEnumerator
点的位置(否则需要使用IEnumWbemClassObject**
的参数)。
对指针的引用与对任何其他类型的引用具有相同的行为,只需将上面的示例视为"对指针的引用",而不是"指向引用的指针"。不存在指向引用的指针
其优点与使用引用代替指针相同:
- 简单
- 引用不能为空,所以在
Query
中给引用赋值不会导致访问冲突
注意原来的描述有误:IEnumWbemClassObject* &
是指向指针的引用,而不是指向引用的指针。
最好考虑Type&foo*作为对指针的引用,而不是反过来,因为它不再意味着你可以通过指针修改引用和其他类似的破坏c++的想法。它还使函数调用更容易相信,因为它就像通过引用传递其他任何东西一样,不需要解引用或特殊符号。
这是因为指针和引用在正常的c++实现中表示相同(这是实现细节,但不是标准的一部分)。而且它是指向指针的引用,而不是指向引用的指针,所以根本不允许创建指向引用的指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错