C中不兼容的指针类型

所以我试图将一个类型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 ); 

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

即使所有其他指针类型都可以在没有信息丢失的情况下转换为void * ,但对于void **和其他指针指向类型也是如此; 如果你取消引用void **指针,它需要指向一个真正的void *对象1

在这种情况下,假设dequeue()通过提供的指针存储它返回单个指针值,为了正式正确,你需要做:

 int main( void ) { void *p; double *target; success = dequeue(queueIn, &p); target = p; 

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


1. …或char *unsigned char *signed char *对象,因为对这些有特殊规则。

在你的原型声明中,你说第二个参数为void** ,所以你必须输入cast doublee**void** 。 而不是这一行success = dequeue(queueIn, &target);

像这样success = dequeue(queueIn,(void**) &target);调用success = dequeue(queueIn,(void**) &target);

 int main( void ) { // Local Declaration double *target; // Statement success = dequeue(queueIn, (void**)&target); } 

像这样使用它。