void指针:C和C ++之间的区别

时间:2009-11-15 06:57:09

标签: c++ c void-pointers

我试图理解C和C ++之间关于void指针的区别。下面用C语言编译但不用C ++编译(用gcc / g ++ -ansi -pedantic -Wall完成的所有编译):

int* p = malloc(sizeof(int));

因为malloc返回void*,C允许分配给int*,而C允许这样做。

但是,这里:

void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}

C ++和C都编译它没有抱怨。为什么呢?

K& R2说:

  

任何指向对象的指针都可能是   转换为void *类型而不会丢失   信息。如果结果是   转换回原始指针   类型,原始指针是   回收

这很好地总结了C中的void*转换.C ++标准规定了什么?

3 个答案:

答案 0 :(得分:32)

在C中,与void*之间的指针转换始终是隐含的。

在C ++中,从T*void*的转化是隐式的,但void*到其他任何内容都需要转换。

答案 1 :(得分:6)

C ++比C更强类型。许多转换,特别是那些暗示对值的不同解释的转换,需要显式转换。 C ++中的 new 运算符是一种类型安全的方法,可以在堆上分配内存,而无需显式转换。

答案 2 :(得分:-1)

理解指针类型转换并不需要执行额外的CPU指令是很有用的。在编译期间对它们进行分析,以了解开发人员的意图。 void *是一个不透明的指针。它只是说尖头物体的类型是未知的。 C是弱类型的。它允许隐式地在(void *)和任何(T*)之间直接转换。 C ++是强类型的。从(void *)到(T*)的转换对于强类型语言来说并不是很好的理由。但是C ++必须保持向后兼容C,因此它必须允许这样的转换。那么指导原则是:明确比隐含更好。因此,如果您希望将(void*)转换为某个特定(T*)指针,则需要在代码中明确地将其写入。从(T*)到(void*)的转换不需要显式转换,因为没有什么可以直接对(void *)指针执行(可以调用free())。因此(T*)到(void*)转换非常安全。