2011-12-16 123 views
57

可能重复:
What is a void pointer and what is a null pointer?什么是C++中的void指针?

我经常看到代码,类似于像下面这样:

void * foo(int bar);

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

+0

类似问题的链接:http://stackoverflow.com/questions/4334831/what-is-a-void-pointer-and-what-is-a-null-pointer – ksming 2011-12-16 05:17:46

+0

它与`动态无关`并且与`object`只有很大的“相似性”。 – 2011-12-16 05:18:02

回答

69

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

这并不是说它可以返回任何东西。返回void*的函数一般会执行以下操作之一:

  • 它正在处理未格式化的内存。这是operator newmalloc返回的内容:指向特定大小内存块的指针。由于内存没有类型(因为它没有一个适当构造的对象),它是无类型的。 IE:void
  • 这是一个不透明的手柄;它引用一个创建的对象而不命名特定的类型。这样做的代码通常构造不佳,因为通过forward声明一个结构/类并且不提供公共定义可以更好地完成此操作。因为那样,至少它有一个真实的类型。
  • 它有明确的文件告诉你可以使用指针的类型。

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

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

4

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

+7

任何指针都可以指向任何东西。 – 2011-12-16 05:21:46

22

A void*指针用于指示指向大块内存而不指定类型的指针。 C的malloc返回这样一个指针,期望您立即将其转换为特定类型。直到将其转换为另一个指针类型时,它才真正有用。您需要知道将其转换为哪种类型,编译器没有反射能力来知道底层类型应该是什么。

+0

那么,C的`malloc`实际上并不期望你立即将它转换为其他东西,因为在C中,`void *`会自动提升为一个真正的指针类型:http://stackoverflow.com/q/605845/ 837703。 C++是一个不同的故事,但你应该在C++中使用`new`。 – 2015-07-11 22:12:48

+1

@ArkaMajumdar隐式演员仍然是演员。指针的类型发生变化,这使得它变得有用。 – 2015-07-12 00:44:28

20

Void用作关键字。指针,也称为泛型指针,是一种特殊类型的指针,可以指向任何数据类型的对象!一个空指针被宣布像一个正常的指针,用void关键字作为指针的类型:

常规语法:

void* pointer_variable; 

void *pVoid; // pVoid is a void pointer 

一个空指针可以指向任何数据类型的对象:

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