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

时间:2011-02-24 12:27:36

标签: c++ c ios

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

5 个答案:

答案 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的指针无法转换为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*可以指向内存中的地址,但语法没有类型信息。您可以将它强制转换为您想要的任何指针类型,但您的责任是该类型与数据的语义相匹配。