具体来说,它可以指向int / float等吗? 那些像NSString之类的对象呢? 任何例子都将不胜感激。
答案 0 :(得分:29)
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)
另请注意,如果没有void*
const_cast
E.g。
const int * pc = new const int(4);
void * pv = pc; //Error
const void* pcv = pc; //OK
H个。
答案 1 :(得分:17)
在C中,任何指针都可以指向内存中的任何地址,因为类型信息在指针中,而不在目标中。所以int *只是一个指向某个内存位置的指针,它被认为是一个整数。 void *指针,只是指向未定义类型的内存位置的指针(可以是任何内容)。
因此任何指针都可以转换为void *,但不能反过来,因为通过执行转换来转换(例如)指向int指针的void指针向其添加信息,你宣称目标数据是整数,所以你必须明确说出这一点。反过来说,你所做的只是说int指针是某种指针,这很好。
在C ++中可能是相同的。
答案 2 :(得分:5)
除了其他用户已经说过的其他内容之外,它还常用于回调定义void*
。这允许您的回调接收任何类型的用户数据,包括您自己定义的对象/结构,在使用之前应该将其转换为适当的类型:
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
}
}
}
答案 3 :(得分:4)
void *
可以指向内存中任何类似数据的东西,比如整数值,结构或其他任何内容。
但请注意,您无法在void *
和函数指针之间自由转换。这是因为在某些体系结构中,代码与数据不在同一地址空间中,因此代码的地址0x00000000可能是指数据的地址0x00000000之外的一组不同的位。
有可能实现编译器,以便void *
足够大以记住差异,但总的来说我认为没有完成,而是语言使其未定义。
在典型/主流计算机上,代码和数据驻留在同一地址空间中,如果将函数指针存储到void *
中,编译器通常会生成合理的结果,因为它非常有用。 / p>
答案 4 :(得分:0)
void*
可以指向内存中的地址,但语法没有类型信息。您可以将它强制转换为您想要的任何指针类型,但您的责任是该类型与数据的语义相匹配。