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

可能重复:
什么是空指针,什么是空指针?

我经常看到类似下面这样的代码:

void * foo(int bar);

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

void*并不意味着什么。 它是一个指针,但它指向的types是未知的。

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

  • 它处理无格式的内存。 这是operator newmalloc返回的内容:指向特定大小的内存块的指针。 由于内存没有types(因为它没有一个正确构造的对象),它是无types的。 IE: void
  • 这是一个不透明的手柄; 它引用一个创build的对象,而不用命名特定的types。 这样做的代码通常结构不好,因为通过向前声明一个结构/类,而不是提供公共定义,这样做更好。 因为那样,至less它有一个真正的types。
  • 它有明确的文档告诉你可以使用指针的types。

它不像C#中的dynamicobject 。 那些构造实际上知道原始types是什么; void* 。 这使得它比其中任何一个更危险,因为很容易弄错。

而且个人来说,如果你看到使用void*的代码“经常”,你应该重新考虑你正在查看的代码。 void*用法, 特别是在C ++中,应该是罕见的,主要用于处理原始内存。

当你想指定一个指向大块内存的指针而不指定types时,就使用void*指针。 C的malloc返回这样的一个指针,期待你立刻把它转换成一个特定的types。 直到将其转换为另一个指针types,它才真正有用。 您需要知道将其转换为哪种types,编译器没有reflectionfunction来知道底层types应该是什么。

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

一般语法:

 void* pointer_variable; void *pVoid; // pVoid is a void pointer 

一个void指针可以指向任何数据types的对象:

 int nValue; float fValue; struct Something { int nValue; float fValue; }; Something sValue; void *pVoid; pVoid = &nValue; // valid pVoid = &fValue; // valid pVoid = &sValue; // valid 

但是,由于void指针不知道它指向的是什么types的对象,所以不能解除引用! 相反,void指针必须首先明确地转换为另一个指针types,然后才能解除引用。

 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 

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