无效指针指针(无效**)
Void pointer pointer (void **)
我正在http://msdn.microsoft.com/en-us/library/windows/desktop/dd389098(v=vs.85).aspx
我真的无法理解中的(无效**)
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
因此,我尝试了类不同类型指针返回的一些值
class Point{
private:
int x, y;
public:
Point(int inputX, int inputY){x = inputX, y = inputY;}
int getX(){return x;}
int getY(){return y;}
friend ostream& operator << (ostream &out, Point &cPoint);
Point operator-(){
return Point(-x, -y);
}
};
ostream& operator << (ostream &out, Point &cPoint){
return out<< "(" << cPoint.x << ", " << cPoint.y << ")";
}
并打印出
Point *p = new Point(1,2);
cout << p << endl << &p << endl << endl
<< *&p << endl<< **&p << endl<<endl
<< (void *) &p << endl << (void **) &p ;
(void*)实际上与(void**)没有区别。什么是(void**)&pControl要返回吗?
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
(void **)&pControl
想要返回什么?
QueryInterface()
是IUnknown
的三种方法之一,是所有COM接口的基本根接口。
IUnknown::QueryInterface()
的MSDN文档明确指出:
HRESULT QueryInterface( [in] REFIID riid, [out] void **ppvObject );
ppvObject[out]接收riid参数中请求的接口指针的指针变量的地址。成功返回后,*ppvObject包含请求的指向对象如果对象不支持接口,*ppvObject将设置为NULL。
因此,在您的特定情况下,成功返回后,pControl
将包含指向IMediaControl
接口的请求指针,如函数调用中通过第一个参数IID_IMediaControl
指定的那样。
现在,让我们试着更好地理解为什么使用双指针间接寻址:void**
。
void*
的意思是"指向任何东西的指针"。
因此,人们可能会想:"为什么QueryInterface()
的第二个参数不只是void*
?"
问题是此参数是输出参数。这意味着QueryInterface()
将在该参数中写入内容,供调用方使用。
而且,在C中(COM有几个C语言),当您有一个输出参数时,您必须使用指针(*
)
(注意在C++中,您也可以使用参考&
。)
因此,在这种情况下,我们有void*
的第一级间接性,这意味着"指向任何东西的指针"
第二个间接级别(另一个*
),意思是:"这是一个输出参数"。
你也可以这样想:
typedef void* PointerToAnything;
HRESULT QueryInterface(..., /* [out] */ PointerToAnything* pSomeInterface);
// pSomeInterface is an output parameter.
//
// [out] --> use * (pointer),
// so it's 'PointerToAnything*' (not just 'PointerToAnything'),
// so, with proper substitution, it's 'void**' (not just 'void*').
- 如何实现容纳整数和无效指针的双向链表?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 应用地址清理器后,免费无效指针消失
- C++ 在具有数组成员的类上无效指针/双精度释放
- 不断得到分段错误和free()无效指针
- 使用无效指针初始化指针声明符的行为是否未定义?
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 无效指针、隔离标识符等
- c++ 无效指针从空闲列表中取消排队
- C++ munmap_chunk(): 无效指针:
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 无效指针和非初始化的指针之间的差异
- 如何用无效指针初始化unique_ptr的向量
- 地址清理器在静态强制转换无效指针时报告错误
- MS4:Free(Free()无效指针0xB74E74E0 ***
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- 无效指针功能的输出
- 有人能告诉我这是如何在main()中实现的吗?(关于无效指针的问题)
- C++11使用智能指针,但得到无效指针
- 无效指针的相关性