什么是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与数据的语义相匹配是你的责任。