void指针写作void*,是一种特殊类型的指针,可以指向任意数据类型的对象。

但是,由于void指针不知道指向的对象类型,它不能被dereferenced。在deferenced之前,它必须显式地转换成另一个指针类型(也就是真实的对象类型)。

例子:

int nValue;
float fValue;

struct Something {
	int nValue;
	float fValue;
};

Something sValue;

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

// 无法dereference pVoid,因为它是void指针
// 将void*转成int*
int* pInt = static_cast<int*>(pVoid);
cout << *pInt << endl; // pInt可以dereference

一个函数返回void*一般做如下事情:

  • 它在处理未格式化的内存。 newmalloc返回一个指针,其指向有特定大小的一块内存。由于内存没有类型(因为还没有在内存里构造对象),所以该指针是void*
  • 一个不透明的处理(opaque handle)。它指向一个创建好的对象,但是不说明具体类型。
  • 返回指向存储的指针,存储中包含已知类型的一个对象。但是这个API用于处理各种类型的对象,在编译时无法知道特定调用返回的确切类型。因此,将有一些文档解释它何时存储哪些类型的对象,然后你可以安全地将其转换为哪种类型。

void指针和C#里面的dynamicobject不同,后者还是能知道原始类型,但是前者不能。

void指针的使用应当很少见,尤其是在C++中,它应主要用于处理原始内存。

参考