什么是C ++中的void指针?
可能重复:
什么是空指针,什么是空指针?
我经常看到类似下面这样的代码:
void * foo(int bar);
这是什么意思? 这是否意味着它可以返回任何东西 ? 这是类似于C#中的dynamic
或object
吗?
void*
并不意味着什么。 它是一个指针,但它指向的types是未知的。
这不是它可以返回任何东西。 返回void*
函数通常是在执行以下操作之一:
- 它处理无格式的内存。 这是
operator new
和malloc
返回的内容:指向特定大小的内存块的指针。 由于内存没有types(因为它没有一个正确构造的对象),它是无types的。 IE:void
。 - 这是一个不透明的手柄; 它引用一个创build的对象,而不用命名特定的types。 这样做的代码通常结构不好,因为通过向前声明一个结构/类,而不是提供公共定义,这样做更好。 因为那样,至less它有一个真正的types。
- 它有明确的文档告诉你可以使用指针的types。
它不像C#中的dynamic
或object
。 那些构造实际上知道原始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信息的原始指针)。