2009-01-04 114 views

回答

39

指向void的指针,void*可以指向任何对象:

int a = 5; 
void *p = &a; 

double b = 3.14; 
p = &b; 

你不能间接引用,增加或减少该指针,因为你不知道你点什么类型。这个想法是,void*可以用于像memcpy这样的功能,它们只是复制内存块,并不关心它们复制的类型。

+0

waw - 我不知道你不能增加一个void *!谢谢! – xtofl 2009-01-04 18:37:51

+0

不少编译器会让你 - 他们假设所有指针类型都是32位。这是错误的,但在Windows上常见的人们假设32位x86。 – 2009-01-04 21:26:09

4

这只是一个普通的指针,用来传递数据时,你不知道类型的一些例子。您必须将其转换为正确的类型才能使用它。

2

这是一个指向的任何东西 - 只是你可以玩的一块内存 - 可能是一个对象,可能是一个字符。你必须施展才能做任何有用的事情。

2

Building off my prior posting...


注意:这里所有的内存地址都是虚构的。我只是让他们来说明一个观点。


考虑:

int data[] = {10,11,12}; 

我们现在有:

0xffff0000-0xffff0003 with a value of (int)(10) 
0xffff0004-0xffff0007 with a value of (int)(11) 
0xffff0008-0xffff000b with a value of (int)(12) 

(我打算进入大端VS little-endian字节顺序在这里。)我们有:

int * p = data; 

我们现在有另一个内存位置的其他地方,说:

0xaaaa0000-0xaaaa0003 with a value of (int*)0xffff0000 

我们可以使用P [1] [或*(P + 1)]是指*(INT *)( 0xffff0004)[= 11],因为sizeof(int)= 4,0xffff0000 + sizeof(int)= 0xffff0004。

如果我们有:

void * v = data; 

我们现在有另一个内存位置的其他地方,说:

0xbbbb0000-0xbbbb0003 with a value of (void*)0xffff0000. 

但是,无效没有任何相关的sizeof()的信息。我们不能增加或减少指针。我们无法解引用访问存储在0xffff0000中的数据。我们只能将该值用作原始内存地址。

如果我们想要使用存储在(void *)0xffff0000中的数据,我们首先需要将其转换为适当的类型。

这就是说,(void *)作为将地址传递给任意数据结构的手段仍然非常有用。例如,memset()。无论我是否将struct tmstruct sockaddr置零。我们只需要一个指向结构体和它的大小的指针。

(这不用说,但是...用memset零出一个类的实例当心,并在这样做,覆盖虚拟指针表。)

1

空指针不能指向类成员在C++中。