【发布时间】:2014-05-30 07:03:34
【问题描述】:
我正在阅读http://msdn.microsoft.com/en-us/library/windows/desktop/dd389098(v=vs.85).aspx 的 COM 示例
我真的无法理解
中的(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*,就不需要演员了 -
指针是特定于它们的类型,唯一的例外是
void*,它只是“无类型”。但是指向(任意)指针的指针总是是专门类型的。在这种情况下,底层 declvoid**是一个指向空指针的指针。之所以需要强制转换,是因为&pControlevals 是指向特定类型的指针的地址(在您的情况下,是指向pControl的任何类型的指针的地址)。而void*可以保存任何data类型的地址;而 code 指针(指向函数的指针,成员或其他)是另一回事。 -
不是任何类型,而是任何 data 类型。您不能(安全地)为
void*分配函数指针。void*是泛型在 C 中的实现方式,例如 qsort。在 C++ 中,我们有模板和多态性,所以它几乎不常见 -
"404 Page Not Found" 虽然......也许是这个? learncpp.com/cpp-tutorial/613-void-pointers
-
@HoyCheung 不,我只是弄乱了 url 语法,已编辑。
标签: c++ pointers com void-pointers pointer-to-pointer