我正在阅读一个关于COM示例的文章,链接地址为:http://msdn.microsoft.com/en-us/library/windows/desktop/dd389098(v=vs.85).aspx
但是我无法理解中的(void **)。
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想要返回什么?
void*
是指向某些未知数据类型的指针。void**
有一个更具体的类型,它是指向void*
的指针,它们不同。除非pControl
是一个void*
,否则这种行为是不安全的。如果它是一个void*
,那么转换就不是必要的。 - Ryan Hainingvoid*
,它只是"未类型化"。但是指向(任何)指针的指针总是具有特定的类型。在这种情况下,底层声明void**
是指向指向void的指针。需要进行类型转换,因为&pControl
计算为指向特定类型的指针的地址(在您的情况下,指向pControl
的指针的地址)。而void*
可以保存来自任何数据类型的地址;而指向代码的指针(函数指针、成员指针等)则另当别论。 - WhozCraig