我正在阅读Ogre3D实现中的一些代码,我不明白void *
类型变量的含义。在C++中指向void
的指针是什么?在C++中指向void的指针?
回答
指向void的指针,void*
可以指向任何对象:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
你不能间接引用,增加或减少该指针,因为你不知道你点什么类型。这个想法是,void*
可以用于像memcpy
这样的功能,它们只是复制内存块,并不关心它们复制的类型。
这是一个指向内存中某个点的原始指针。它不允许像char *或int *这样的指针运算。
这里的用法
这只是一个普通的指针,用来传递数据时,你不知道类型的一些例子。您必须将其转换为正确的类型才能使用它。
这是一个指向的任何东西 - 只是你可以玩的一块内存 - 可能是一个对象,可能是一个字符。你必须施展才能做任何有用的事情。
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 tm或struct sockaddr置零。我们只需要一个指向结构体和它的大小的指针。
(这不用说,但是...用memset零出一个类的实例当心,并在这样做,覆盖虚拟指针表。)
空指针不能指向类成员在C++中。
- 1. C++ void指针
- 2. 绑定void *指向C++/Cli基本类型指针的指针
- 3. 在C++中投射一个指向易失性void **的指针
- 4. C++ - 指向数组的指针 - 指针
- 5. 指向C++指针的指针
- 6. C++指定指向指针
- 7. 在C++中删除void *指针
- 8. void指针
- 9. C++指向类的指针
- 10. 指向int的指针。 C++
- 11. 类的指针void *
- 12. 什么是C++中的void指针?
- 13. 是否可以在C++中声明指向模板函数的void指针?
- 14. 返回void的C++/C函数指针*
- 15. C将指针指向NULL
- 16. 指针指向托管C++
- 17. 指向指针的指针和指向数组的指针
- 18. 铸造指针对象为void *在C++
- 19. 试验在C++ void指针删除
- 20. C++ - 指向向量的指针数组?
- 21. 指向objective-c中的指针的指针?
- 22. 指向void
- 23. 在C++中为指针指定指针
- 24. 指向指针的指针与C中指针的地址有什么区别?
- 25. 指针指向在C的字符串指针数组++
- 26. 如何初始化指针指向C中的指针结构?
- 27. 指针指向参数中的指针C
- 28. 传递指向C++中另一个指针的'const'指针
- 29. 指针指向指针
- 30. C:从void指针的外插类型
waw - 我不知道你不能增加一个void *!谢谢! – xtofl 2009-01-04 18:37:51
不少编译器会让你 - 他们假设所有指针类型都是32位。这是错误的,但在Windows上常见的人们假设32位x86。 – 2009-01-04 21:26:09