C++ 什么是void*以及它可以指向哪些变量/对象

C++ 什么是void*以及它可以指向哪些变量/对象,c++,c,ios,C++,C,Ios,具体来说,它能指向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\u cast 例如 Hth.void*可以指向内存

具体来说,它能指向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\u cast

例如


Hth.

void*
可以指向内存中的地址,但语法没有类型信息。您可以将其强制转换为您想要的任何指针类型,但您有责任确保该类型与数据的语义相匹配

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

因此,任何指针都可以强制转换为void*,但不能反过来转换,因为将void指针强制转换为int指针(例如)是在向其添加信息——通过执行强制转换,您可以声明目标数据是整数,因此,自然您必须明确地说这一点。另一方面,你所做的就是说int指针是某种类型的指针,这很好


在C++中可能是相同的。<> > p>代码> Vult*/Coo>可以指向内存中的任何数据类事物,如整型值、结构或其他任何东西。

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

可以实现编译器,使
void*
足够大以记住差异,但一般来说,我认为这并没有做到,相反,语言没有定义它


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

除了其他用户已经说过的一切,a
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
        }
    }
}

不完全是。在C++中,如果没有conconsCaskor,则不能将conx x*转换为空洞*,最后我看,在裸露的C/C++内存内容中,除非明确地包含在数据本身中(例如,一个框架可能很好地使用的魔法常数),否则不包含运行时类型信息。@Michael:如果你有一个非空指针,那么语法会携带类型信息@Armen:C++(和C!)编译器不将空指针指向空指针的原因是,const指针不是指向内存地址的指针,而是在Link时映射到全局。如果我们谈论编译时间(链接时间)常量,那么这可能是正确的。在C++中,一个常量对象的值不一定是已知的链接时间。空指针怎么样?这是它的名字。如果我没有错,在C++中,与C++不同的是,从空洞到int的转换也是隐式的。@ Aman HMM,看来你是对的。我应该检查一下。在Objto-C中,<代码>空洞*>代码> =代码> ID >代码>,RANDY MARSH,不,但是`void*`类似于Objective中的
id
,C
id
是指向编译器特别处理的结构的指针。
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
        }
    }
}