我正在阅读 Ogre3D 实施中的一些代码,我无法理解 void * 类型变量意味着。在C ++中指向 void 的指针是什么意思?

有帮助吗?

解决方案

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

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

double b = 3.14;
p = &b;

您不能取消引用,递增或递减该指针,因为您不知道指向哪种类型。我们的想法是 void * 可以用于像 memcpy 这样的函数,它只是复制内存块,而不关心它们复制的类型。

其他提示

它只是一个通用指针,用于在不知道类型时传递数据。您必须将其强制转换为正确的类型才能使用它。

它是指向内存中某个点的原始指针。它不允许任何指针算术,如char *或int *。

以下是一些使用示例

http://theory.uwinnipeg.ca/programming/node87.html

它是指向任何的指针 - 只是你可以玩的一块内存 - 可能是一个对象,可能是一个char。你必须施展以做任何有用的事情。

建立我先前发布的内容...


注意:此处的所有内存地址都是虚构的。我只想说明一点。


假设:

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)

(我会在这里进入big-endian 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.

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

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

那就是说,(void *)作为一种将地址传递给任意数据结构的方法仍然非常有用。例如,memset()。我是否将 struct tm struct sockaddr 归零并不重要。我们只需要一个指向结构及其大小的指针。

(这应该不用说了,但是......请注意使用memset将类实例归零,并在此过程中覆盖虚拟指针表。)

void指针不能指向C ++中的类成员。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top