什么是 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# 中的 dynamic
或 object
?
【问题讨论】:
类似问题的链接:***.com/questions/4334831/… 它与dynamic
没有任何关系,只是与object
有很大的“相似性”。
@ChrisFarr 您无法通过删除重复通知来重新打开此问题。它只会隐藏这个被关闭的问题。如果您认为应该重新打开,请考虑在 meta 上创建一个帖子。
【参考方案1】:
void*
没有任何意义。它是一个指针,但它指向的类型是未知的。
并不是说它可以返回“任何东西”。返回 void*
的函数通常执行以下操作之一:
operator new
和malloc
返回的内容:指向特定大小内存块的指针。由于内存没有类型(因为它还没有正确构造的对象),所以它是无类型的。即:void
.
它是一个不透明的手柄;它引用创建的对象而不命名特定类型。执行此操作的代码通常格式不正确,因为通过前向声明结构/类而不为它提供公共定义来更好地完成此操作。因为那样的话,至少它有一个真实的类型。
它返回一个指向包含已知类型对象的存储的指针。但是,该 API 用于处理多种类型的对象,因此在编译时无法知道特定调用返回的确切类型。因此,将有一些文档说明它何时存储哪些类型的对象,以及您可以安全地将其转换为哪种类型。
这个构造没有类似于 C# 中的 dynamic
或 object
。这些工具实际上知道原始类型是什么; void*
没有。这使得它比其中任何一个都危险得多,因为它很容易出错,而且没有办法询问特定用法是否正确。
就个人而言,如果您看到使用void*
的“经常”的代码,您应该重新考虑您正在查看的代码。 void*
用法,尤其是在 C++ 中,应该很少见,主要用于处理原始内存。
【讨论】:
感谢 +1 将 void* 比作 C# / JavaObject
【参考方案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++ 中的空指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章