所以我尝试将类型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 );
我认为如果我将目标作为两级指针传递它会起作用,但我想我错了。有人可以向我解释为什么我会收到这个警告?
答案 0 :(得分:5)
即使所有其他指针类型都可以在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 *
对象,因为这些对象有特殊规则。
答案 1 :(得分:0)
在原型声明中,您说第二个参数为void**
,因此您必须输入强制转换double**
到void**
。
而不是这一行success = dequeue(queueIn, &target);
。
像这样调用success = dequeue(queueIn,(void**) &target);
答案 2 :(得分:-1)
int main( void )
{
// Local Declaration
double *target;
// Statement
success = dequeue(queueIn, (void**)&target);
}
像这样使用它。