引用void *指针中的问题?

时间:2011-09-01 21:31:13

标签: c++ c

此代码:

int p = 10;
void *q;
*q = 10;

不编译:

  

'=':无法从'int'转换为'void *'

但是,这段代码编译得很好:

int p = 10;
void *q;
q = &p;

背后的原因是什么?

6 个答案:

答案 0 :(得分:5)

A void *指向未知类型的数据(如果已初始化,则不是您的数据)。

您只能分配已知类型的变量,或通过已知类型的指针。

int p = 10;
void *q = &p;

*(int *)q = 20;

if (p != 20)
    ...something has gone horribly wrong...

这会将void *转换为int *,然后为该解除引用的整数指针赋值。

答案 1 :(得分:4)

任何指针都可以转换为void*,但取消引用指向void的指针是违法的。

答案 2 :(得分:1)

第一个片段是未定义的行为

答案 3 :(得分:1)

这两段代码(尝试)做了不同的事情。

第一个尝试将值10分配给对象q指向。这里有两个问题。首先,你从未初始化指针。在更改指向的值之前,您需要将其指向某个位置。第二,你不能解除引用void*,因为类型是未知的。

第二段代码是将变量p的地址分配给q。在此q将指向存储在p

中的对象

答案 4 :(得分:1)

这会将内存q中的地址更改为:

q = &p;

这无法确定q指向的内容的类型(intlongstd::stringint**等等;所有它知道的是内存中的位置:

*q = 10;

你可以这样做:

int *iq = static_cast<int*>(q);
*iq = 10;

您可能想要了解有关void*s的更多信息。

答案 5 :(得分:0)

您无法取消引用void指针。即使你可以,你的代码也会写入一些随机内存地址并可能崩溃。

在第二个代码块中,您正在分配指针的地址,该指针工作正常,因为您可以将任何内存地址分配给void*