我经常看到类似于以下内容的代码:
void * foo(int bar);
这是什么意思?这是否意味着它可以返回任何?这与C#中的dynamic
或object
相似吗?
答案 0 :(得分:89)
void*
没有任何意义。它是一个指针,但它指向的类型是未知的。
并不是它可以返回“任何东西”。返回void*
的函数通常执行以下操作之一:
operator new
和malloc
返回的内容:指向特定大小的内存块的指针。由于内存没有类型(因为它还没有正确构造的对象),因此它是无类型的。 IE:void
。这个构造在C#中只是 nothing ,如dynamic
或object
。这些工具实际上知道原始类型是什么; 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 *可以指向任何东西(它是没有任何类型信息的原始指针)。