【问题标题】:Usage of void pointers in C++ [closed]在 C++ 中使用 void 指针 [关闭]
【发布时间】:2015-12-06 00:48:13
【问题描述】:

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

【问题讨论】:

  • 它们通常是与 C API 接口所必需的。
  • 这有点像家庭作业问题。如果您表明您已经做出了一些努力,并且可能正在寻求澄清,那会很好。但这并不明显。这里似乎也有多个问题。 Stack Overflow 上一次一个问题。
  • 它们有时也可用于类型擦除。
  • A void* 它是一个指针,但它指向的类型是未知的。处理未格式化的内存。这就是 operator new 和 malloc 返回的内容:一个指向特定大小内存块的指针。
  • 它们的用途是什么?当您不知道/不关心指向的内存类型时。在带有模板的 C++ 中有点不必要,但仍然是达到目的的一种手段。

标签: c++ pointers void-pointers


【解决方案1】:

Void 指针可以被视为传递事物的一种中立方式。与非空指针不同,空指针可以指向任何你想要的。

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

int myvar;

如果您想使用指针将其传递到某个地方,有两种方法可以处理此变量:

int *myvar_ptr = &myvar;

void *myvar_ptr = &myvar;

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

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

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

myvar_ptr++;

如果myvar_ptr 是一个空指针,因为您不知道+1 在内存方面表示什么。可能是一个字符,也可能是一个大胖物体。

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

编辑:

很抱歉误读了您的问题标题。因为我不希望我的写作在这里浪费,所以是旧帖子。

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

指针对

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

指针也可能让人头疼:

  • 许多书籍/教程在以易于理解的方式解释如果不正确使用指针会如何搞砸事情(除此之外非常糟糕)方面做得很差
  • 堆栈指针指针指针指针...可能导致极度混淆(意味着难以阅读和理解)代码
  • 在涉及动态内存分配的情况下,您总是有可能错过某些内容,并且存在大量内存泄漏。但是话又说回来,您可以将堆栈上的某些内容分配给指针。 ;)

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

【讨论】:

  • 请注意,我问的是 void 指针,尽管这一切都很好。
  • 啊抱歉,会添加这个。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多