什么是 C++ 中的空指针? [复制]

Posted

技术标签:

【中文标题】什么是 C++ 中的空指针? [复制]【英文标题】:What is a void pointer in C++? [duplicate] 【发布时间】:2012-01-21 17:43:36 【问题描述】:

可能重复:What is a void pointer and what is a null pointer?

我经常看到类似于以下内容的代码:

void * foo(int bar);

这是什么意思?这是否意味着它可以返回任何东西?这是否类似于 C# 中的 dynamicobject

【问题讨论】:

类似问题的链接:***.com/questions/4334831/… 它与dynamic 没有任何关系,只是与object 有很大的“相似性”。 @ChrisFarr 您无法通过删除重复通知来重新打开此问题。它只会隐藏这个被关闭的问题。如果您认为应该重新打开,请考虑在 meta 上创建一个帖子。 【参考方案1】:

void* 没有任何意义。它是一个指针,但它指向的类型是未知的。

并不是说它可以返回“任何东西”。返回 void* 的函数通常执行以下操作之一:

它正在处理未格式化的内存。这就是operator newmalloc 返回的内容:指向特定大小内存块的指针。由于内存没有类型(因为它还没有正确构造的对象),所以它是无类型的。即:void. 它是一个不透明的手柄;它引用创建的对象而不命名特定类型。执行此操作的代码通常格式不正确,因为通过前向声明结构/类而不为它提供公共定义来更好地完成此操作。因为那样的话,至少它有一个真实的类型。 它返回一个指向包含已知类型对象的存储的指针。但是,该 API 用于处理多种类型的对象,因此在编译时无法知道特定调用返回的确切类型。因此,将有一些文档说明它何时存储哪些类型的对象,以及您可以安全地将其转换为哪种类型。

这个构造没有类似于 C# 中的 dynamicobject。这些工具实际上知道原始类型是什么; void* 没有。这使得它比其中任何一个都危险得多,因为它很容易出错,而且没有办法询问特定用法是否正确。

就个人而言,如果您看到使用void* 的“经常”的代码,您应该重新考虑您正在查看的代码。 void* 用法,尤其是在 C++ 中,应该很少见,主要用于处理原始内存。

【讨论】:

感谢 +1 将 void* 比作 C# / Java Object【参考方案2】:

Void 用作关键字。 void 指针,也称为泛型指针,是一种特殊类型的指针,可以指向任何数据类型的对象! void 指针与普通指针一样声明,使用 void 关键字作为指针的类型:

一般语法:

void* pointer_variable;

void *pVoid; // pVoid is a void pointer

void 指针可以指向任何数据类型的对象:

int nValue;
float fValue;

struct Something

    int nValue;
    float fValue;
;

Something sValue;

void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid

但是,因为void指针不知道它指向的是什么类型的对象,所以不能解引用!相反,void 指针必须先显式转换为另一种指针类型,然后才能取消引用。

int nValue = 5;
void *pVoid = &nValue;

// can not dereference pVoid because it is a void pointer

int *pInt = static_cast<int*>(pVoid); // cast from void* to int*

cout << *pInt << endl; // can dereference pInt

来源:link

【讨论】:

在 C++ 中,最后三行会导致编译错误,因为您必须将内容显式转换为 void*,这与 C 不同。 @User1988 请了解如何编辑您的帖子。 代码示例目前有效,谢谢。对我来说,这个问题和前 2 个答案比链接的“重复”更简洁和明确。 最好更完整的答案 需要明确声明函数指针是void指针的异常!【参考方案3】:

void* 指针用于在不指定类型的情况下指示指向一大块内存的指针。 C 的malloc 返回这样一个指针,期望您立即将其转换为特定类型。在您将其转换为另一种指针类型之前,它真的没有用。您应该知道将其转换为哪种类型,编译器没有反射能力来知道底层类型应该是什么。

【讨论】:

好吧,C 的 malloc 实际上并不希望您立即将其转换为其他内容,因为在 C 中,void* 会自动提升为真正的指针类型:***.com/q/605845/837703。 C++ 是另一回事,但无论如何你都应该在 C++ 中使用new @ArkaMajumdar 隐式演员表仍然是演员表。指针的类型发生了变化,这使得它变得有用。【参考方案4】:

一个 void* 可以指向任何东西(它是一个没有任何类型信息的原始指针)。

【讨论】:

任何指针都可以指向任何东西。 @AJ.S 任何指针都可以引用内存中的任何位置***.com/a/19710912/5345050

以上是关于什么是 C++ 中的空指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java中的空指针异常怎么解决

什么是取消引用可能的空指针?

setText时的空指针异常 - TextView [复制]

java servlet中的空指针异常[关闭]

C++中关于返回空指针问题

Java中的空指针问题。