我正在阅读Ogre3D实现中的一些代码,但我无法理解void *
类型变量的含义。void
C++中的指针是什么意思?
6 回答
指向 void 的指针,void*
可以指向任何对象:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
你不能取消引用、增加或减少那个指针,因为你不知道你指向什么类型。这个想法是void*
可以用于像memcpy
这样的功能,只是复制内存块,而不关心它们复制的类型。
它只是一个通用指针,用于在您不知道类型时传递数据。您必须将其转换为正确的类型才能使用它。
它是指向内存中某个位置的原始指针。它不允许任何指针算术,如 char * 或 int *。
以下是一些使用示例
它是一个指向任何东西的指针——只是一块你可以玩的内存——可能是一个对象,也可能是一个字符。你必须强制转换才能用它做任何有用的事情。
注意:这里所有的内存地址都是虚构的。我只是为了说明一个观点而编造它们。
鉴于:
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)
(我不打算在这里讨论大端字节序和小端字节序。)
如果我们有:
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++ 中的类成员。