3

所以我试图将一个类型传递double *给一个接受void **作为参数之一的函数。这是我收到的警告。

incompatible pointer type passing 'double **' to parameter of type 'void **'

这是我的代码片段。

int main( void )
{
    //  Local Declaration
    double *target;

   //   Statement
   success = dequeue(queueIn, &target);
}

这是函数的原型声明。

int    dequeue     ( QUEUE *queue, void **dataOutPtr );

我认为如果我将目标作为两级指针传递它会起作用,但我想我错了。有人可以向我解释一下我为什么会收到这个警告吗?

4

3 回答 3

5

即使所有其他指针类型都可以在void *不丢失信息的情况下相互转换,但其他指针到指针类型并非如此void **;如果您取消引用一个void **指针,它需要指向一个真正的void *对象1

在这种情况下,假设dequeue()通过提供的指针存储它返回单个指针值,要正式正确,您需要执行以下操作:

int main( void )
{
    void *p;
    double *target;

    success = dequeue(queueIn, &p);
    target = p;

当您这样编写它时,从void *to的转换double *是显式的,这允许编译器执行任何必要的魔法(即使在绝大多数情况下,根本没有魔法)。


1. ...or a char *, unsigned char *or signed char *object,因为它们有一个特殊的规则。

于 2013-04-23T07:01:03.837 回答
0

在您的原型声明中,您将第二个参数说为void**,因此您必须键入 cast double**to void**。而不是这一行success = dequeue(queueIn, &target);

像这样打电话success = dequeue(queueIn,(void**) &target);

于 2013-04-23T04:14:15.260 回答
-1
int main( void )
{
    //  Local Declaration
    double *target;

   //   Statement
   success = dequeue(queueIn, (void**)&target);
}

像这样使用它。

于 2013-04-23T04:20:21.703 回答