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

zah*_*pov 18 c c++ void-pointers

我试图理解C和C++之间关于void指针的区别.以下编译用C而不是C++编译(所有编译都用gcc/g ++ -ansi -pedantic -Wall完成):

int* p = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

因为malloc返回void*,C++不允许分配,int*而C允许.

但是,这里:

void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

K&R2说:

任何指向对象的指针都可以转换为类型void *而不会丢失信息.如果结果转换回原始指针类型,则恢复原始指针.

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

GMa*_*ckG 34

在C中,指向或来自的指针转换void*总是隐含的.

在C++中,从转换T*void*是隐含的,但void*其他任何事情需要投.

  • 真的,没有多少引用.它在4.10.2节中.它几乎说`T*`可以转换为`void*`.它没有反过来,暗示你必须使用演员表. (6认同)
  • @GMan:如果通过"在C中,指针转换总是隐含的",你的意思是转换为来自`void*`的转换,你是对的.否则,当涉及指针转换时,C与C++一样严格.例如,在C.中没有从`char*`到`int*`的隐含转换.从历史上看,习惯上将指针转换错误报告为C编译器中的"警告",这导致了关于C的神话,据称允许所有和任何隐式指针转换.然而,这仅仅是一个神话. (2认同)

Vij*_*hew 6

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