什么是C ++中的void指针?

时间:2011-12-16 05:14:20

标签: c++ void-pointers

  

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

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

void * foo(int bar);

这是什么意思?这是否意味着它可以返回任何?这与C#中的dynamicobject相似吗?

4 个答案:

答案 0 :(得分:89)

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

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

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

这个构造在C#中只是 nothing ,如dynamicobject。这些工具实际上知道原始类型是什么; void* 。这使它比任何一个都危险得多,因为它很容易弄错,并且无法询问特定用法是否正确。

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

答案 1 :(得分:28)

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

答案 2 :(得分:23)

如果要在不指定类型的情况下指示指向大块内存的指针,则使用void*指针。 C&#39; malloc返回这样一个指针,希望你立即将它强制转换为特定类型。在将其转换为另一种指针类型之前,它确实没用。您希望知道将其强制转换为哪种类型,编译器没有反射功能来知道底层类型应该是什么。

答案 3 :(得分:4)

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