C++中void指针的使用

Usage of void pointers in C++

它们是否有时是必要的,或者它们是代码设计不佳的症状? 如果是前者,能举个例子吗? 如果是后者,你能解释一下使用它们的危险吗?

可以将 Void 指针视为传递事物的中立方式。与 non-void 不同的是,void 指针可以指向任何你想要的东西。

示例: 假设你有一个整型变量

int myvar;

如果你想使用指针将它传递到某个地方,你可以通过两种方式处理这个变量:

int *myvar_ptr = &myvar;

void *myvar_ptr = &myvar;

在第一种情况下,使用整数指针会限制您仅指向包含整数的内存块。在第二种情况下,您还可以使用浮点数、双精度数、object、某种数组的开头、std 容器等

缺点是,即使你有这种中立的方式传递东西,你仍然必须在某个时候检索 void 指针指向的东西,这意味着你需要将它转换为相应的类型.这是一个非常棘手的部分,如果你做错了,你可以 1) 创建分段错误(想象你的 void 指针指向一个字符数组,但你将它转换回 double -> memory-wise 你跳 "further" 因此访问您不应该访问的内存的可能性非常大),2)损坏您的数据等

void 指针的另一个缺点是缺少指针运算。你不能这样做:

myvar_ptr++;

如果 myvar_ptr 是空指针,因为您不知道 +1 表示什么 memory-wise。可能是一个 char,可能是一个大胖子 object 或者其他。

C++ 中,大多数人更喜欢将指针与模板结合使用,因为与原始类型指针相比,您仍然可以获得更高程度的灵活性,而且有关类型的信息不会丢失。使用模板结合指针为 类 模拟 void 指针并不难,特别是因为我们有东西继承。 Void 也可以用作模板的类型(参见 here)。

编辑:

抱歉误读了您的问题标题。因为我不想让我的文字白费,所以这里是旧的post。

关于指针的一些额外信息:

指针对

很有用
  • 与 C 应用程序交谈(尤其是那些使用 UI API 的应用程序,其中各种组件的事件处理通常(总是?)使用指向函数的指针来完成)
  • 动态内存分配,包括 malloc(和类似的老歌但 goldies)、new 运算符(C++;new 实际上 returns 如果您不知道的话,是一个指针)等
  • 指针算法 - 性能和灵活性
  • 嵌入式软件开发 - 指针允许您非常精确地访问内存(这对于 *nix 系统也是必不可少的,其中 C 是广泛使用的标准语言)
  • 通常提供额外的灵活性和组件的可重用性——不像其他语言 C/C++ 允许你按值和引用传递东西,这意味着你没有义务复制东西(基本上是 按值传递 如果你不想的话。由于一切在内存中都有一个起点,您甚至可以使用指针传递函数(正如我提到的一种非常流行的执行 UI 组件回调的方法)

指针也可以是一个痛苦的屁股:

  • 许多 books/tutorials 在以 easy-to-understand 方式解释如果你不正确地使用指针时如何搞砸事情(最糟糕的是)
  • 指针的指针的指针的堆栈指针...可能导致代码极其混乱(难以阅读和理解)
  • 在涉及动态内存分配的地方,您总是有可能错过某些东西,并且存在严重的内存泄漏。但是话又说回来,您可以将堆栈上的某些内容分配给指针。 ;)

在 C++ 中,正如一些人提到的,这里设法隐藏了很多指针的东西(也许正是为了防止开发人员滥用指针),但你仍然需要它,这取决于你在做什么。

空指针是指向未知类型数据的指针。

比如你可以写一个排序函数来对数据进行排序。您不需要知道数据类型(数字、ASCII 文本、中文、双精度数或其他),算法始终相同。如果您传入一个指向数据的空指针和一个指向数据比较函数的指针,您将能够对数据进行排序。

另一个使用空指针的例子是数据压缩函数。压缩函数不关心数据类型。它只需要知道数据的开始和数据的大小。