2011-09-01 65 views
5

此代码:在void *指针中引用问题?

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

不会编译:

'=':无法从 '诠释' 转换成 '无效*'

然而,这个代码编译罚款:

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

背后的原因是什么?

+0

错误。什么错误? (在这种情况下,它有点显而易见,但你应该总是发布错误。) –

+0

'=':不能从'int'转换为'void *' – teacher

+0

你的编译器很奇怪......它想要从'* q = 10;'''int'''void *' ???在该语句中,'10'的类型为'int','* q'的类型为'void'。 – pmg

回答

5

void *指向未知类型的数据(如果它被初始化的第二代码块,其你的不是)。

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

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

*(int *)q = 20; 

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

此转换void *int *,然后分配一个值到解除引用的整数指针。

4

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

+3

地狱是啊,你不能写点什么都没有的东西。 – kenny

1

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

0

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

在要分配的正常工作的指针的地址,因为你可以指定任何存储器地址到void*

1

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

第一个尝试将值10分配给对象q指向。这里有两个问题。首先你从来没有初始化指针。您需要先将其指向某处,然后才能更改其指向的值。其次,你不能取消void*,因为这个类型是未知的。

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

1

这在内存q点更改地址:

q = &p; 

这不能什么q点式的人物出来(intlongstd::stringint**等);所有它知道是在内存中的位置:

*q = 10; 

你可以这样做:

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

你可能想了解更多关于void*s

2

void *不知道它拿着多少,它拿着什么?

所以你可以指定任何指针类型,因为它可以包含任何大小!但不能分配一个值,因为它不知道它必须存储什么......!

0

您的指针q不指向任何内存位置。所以你不能给它分配值。