什么是void *以及它可以指向哪些variables/对象

具体来说,它可以指向int / float等吗? 那么像NSString之类的对象呢? 任何例子将不胜感激。

void*是一个这样的指针,任何指针都可以隐式转换为void*

例如;

 int* p = new int; void* pv = p; //OK; p = pv; //Error, the opposite conversion must be explicit in C++ (in C this is OK too) 

另外请注意,指向const的指针不能在没有const_cast情况下转换为void*

例如

 const int * pc = new const int(4); void * pv = pc; //Error const void* pcv = pc; //OK 

心连心。

在C中,任何指针可以指向内存中的任何地址,因为types信息在指针中,而不在目标中。 所以int *只是一个指向某个内存位置的指针,它被认为是一个整数。 void *指针只是指向未定义types的内存位置的指针(可以是任何东西)。

因此,任何指针都可以转换为void *,而不是相反,因为将(例如)指向void指针的void指针添加到其中 – 通过执行转换,您声明目标数据是整数,所以自然你必须明确地说出这一点。 相反,你所做的只是说int指针是某种指针,这很好。

这在C ++中可能是一样的。

一个void *可以指向内存中的任何类似数据的东西,比如整数值,结构体或其他。

但请注意,您不能在void *和函数指针之间自由转换。 这是因为在某些体系结构中,代码与数据不在同一个地址空间中,因此对于代码而言,地址0x00000000有可能引用与地址0x00000000不同的一组位。

有可能实现编译器,使void *足够大,以记住差异,但总的来说,我认为这不是完成的,而是语言使其不确定。

在典型的/主stream的计算机上,代码和数据驻留在相同的地址空间,然后编译器通常会生成合理的结果,如果你将函数指针存储到void * ,因为它非常有用。

除了其他用户已经说过的所有东西之外, void*通常用于callback定义。 这允许您的callback接收任何types的用户数据 ,包括您自己定义的对象/结构体,在使用它之前应将其转换为适当的types:

 void my_player_cb(int reason, void* data) { Player_t* player = (Player_t*)data; if (reason == END_OF_FILE) { if (player->playing) { // execute stop(), release allocated resources and // start() playing the next file on the list } } } 

void*可以指向内存中的地址但语法没有types信息。 你可以将它转换为你想要的任何指针types,但是这个types与数据的语义相匹配是你的责任。