C++ 中指向 void 的指针?
我正在阅读 Ogre3D 实现中的一些代码,但我无法理解 void *< /code> 类型变量的意思。 指向
void
的指针在 C++ 中意味着什么?
I'm reading some code in the Ogre3D implementation and I can't understand what a void *
type variable means. What does a pointer to void
mean in C++?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
指向 void、
void*
的指针可以指向任何对象:您无法取消引用、递增或递减该指针,因为您不知道所指向的类型。 这个想法是,
void*
可用于诸如memcpy
之类的函数,这些函数仅复制内存块,而不关心它们复制的类型。A pointer to void,
void*
can point to any object:You can't dereference, increment or decrement that pointer, because you don't know what type you point to. The idea is that
void*
can be used for functions likememcpy
that just copy memory blocks around, and don't care about the type that they copy.它只是一个通用指针,用于在不知道类型时传递数据。 您必须将其转换为正确的类型才能使用它。
It's just a generic pointer, used to pass data when you don't know the type. You have to cast it to the correct type in order to use it.
它是指向内存中某个位置的原始指针。 它不允许任何指针算术,如 char * 或 int *。
以下是一些使用示例
http://theory.uwinnipeg.ca/programming/node87.html
It's a raw pointer to a spot in memory. It doesn't allow any pointer arithmetic like char * or int *.
Here's some examples of usage
http://theory.uwinnipeg.ca/programming/node87.html
它是一个指向任何东西的指针——只是你可以使用的一块内存——可能是一个对象,也可能是一个字符。 你必须使用它来做任何有用的事情。
It's a pointer to anything -- just a chunk of memory that you can play with -- might be an object, might be a char. You have to cast to do anything useful with it.
基于我之前的帖子...
注意:这里的所有内存地址都是虚构的。 我编造它们只是为了说明一点。
假设:
我们现在有:(
我不要在这里讨论大端字节序与小端字节序。)
如果我们有:
我们现在在其他地方有另一个内存位置,说:
我们可以使用 p[1] [或 *(p + 1)] 将 *(int*)(0xffff0004) [=11] 引用为 sizeof(int)=4 和 0xffff0000+sizeof(int ) = 0xffff0004。
如果我们有:
我们现在在其他地方有另一个内存位置,则说:
但是, void 没有任何关联的 sizeof() 信息。 我们不能增加或减少指针。 我们无法取消引用来访问存储在 0xffff0000 中的数据。 我们只能将该值用作原始内存地址。
如果我们想使用 (void*)0xffff0000 中存储的数据,我们首先需要将其转换为适当的类型。
也就是说,(void *) 作为将地址传递到任意数据结构的方法仍然非常有用。 例如,memset()。 无论我将 struct tm 还是 struct sockaddr 清零并不重要。 我们只需要一个指向结构体及其大小的指针。
(这应该是不言而喻的,但是......请注意使用 memset 将类实例清零,并在这样做时覆盖虚拟指针表。)
Building off my prior posting...
ATTENTION: All memory addresses here are fictional. I'm just making them up to illustrate a point.
Given:
We now have:
(I'm not going to get into big-endian vs little-endian byte ordering here.)
If we have:
We now have another memory location somewhere else, say:
We can use p[1] [or *(p + 1)] to refer to *(int*)(0xffff0004) [=11] as sizeof(int)=4 and 0xffff0000+sizeof(int) = 0xffff0004.
If we have:
We now have another memory location somewhere else, say:
However, void doesn't have any associated sizeof() information. We can't increment or decrement the pointer. We can't dereference to access the data stored in 0xffff0000. We can only utilize the value as a raw memory address.
If we want to use the data stored in (void*)0xffff0000, we first need to cast it to an appropriate type.
That said, (void *) is still quite useful as a means of passing addresses to arbitrary data structures around. For instance, memset(). It doesn't matter whether I'm zero'ing out a struct tm or a struct sockaddr. We just need a pointer to the struct and its size.
(This should go without saying, but... Beware using memset to zero out a class instance and, in doing so, overwriting the virtual pointer table.)
void 指针不能指向 C++ 中的类成员。
A void pointer cannot point to a class member in C++.