指向C ++中的void?
-
03-07-2019 - |
题
我正在阅读 Ogre3D 实施中的一些代码,我无法理解 void *
类型变量意味着。在C ++中指向 void
的指针是什么意思?
解决方案
指向void的指针, void *
可以指向任何对象:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
您不能取消引用,递增或递减该指针,因为您不知道指向哪种类型。我们的想法是 void *
可以用于像 memcpy
这样的函数,它只是复制内存块,而不关心它们复制的类型。
其他提示
它只是一个通用指针,用于在不知道类型时传递数据。您必须将其强制转换为正确的类型才能使用它。
它是指向内存中某个点的原始指针。它不允许任何指针算术,如char *或int *。
以下是一些使用示例
它是指向任何的指针 - 只是你可以玩的一块内存 - 可能是一个对象,可能是一个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 ++中的类成员。