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

zeb*_*und 81 c++ void-pointers

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

我经常看到类似于以下内容的代码:

void * foo(int bar);

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

Nic*_*las 100

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

这不是它可以返回"任何东西".返回void*一般的函数正在执行以下操作之一:

  • 它处理无格式的内存.这是什么operator newmalloc返回:指向特定大小的内存块的指针.由于内存没有类型(因为它还没有正确构造的对象),因此它是无类型的.IE : void.
  • 这是一个不透明的手柄; 它引用创建的对象而不命名特定类型.执行此操作的代码通常很难形成,因为通过前向声明结构/类并且根本不为其提供公共定义可以更好地完成此操作.因为那时,至少它有一个真实的类型.
  • 它返回一个指向存储的指针,该存储包含已知类型的对象.但是,该API用于处理各种类型的对象,因此在编译时无法识别特定调用返回的确切类型.因此,会有一些文档说明何时存储哪种对象,以及哪种类型可以安全地将其投射到.

此结构是什么dynamicobject在C#.这些工具实际上知道原始类型是什么; void* 没有.这使得它比任何一个都危险得多,因为它很容易弄错,并且无法询问特定用法是否正确.

另外,如果您看到void*经常使用"s"的代码,您应该重新考虑您正在查看的代码.void*用法,特别是在C++中,应该是罕见的,主要用于处理原始内存.


Use*_*988 28

Void用作关键字.该指针,也被称为通用指针,指针是一种特殊类型,它可以在任何数据类型的对象指出!void指针被声明为普通指针,使用void关键字作为指针的类型:

一般语法:

void* pointer_variable;

void *pVoid; // pVoid is a void pointer
Run Code Online (Sandbox Code Playgroud)

void指针可以指向任何数据类型的对象:

int nValue;
float fValue;

struct Something
{
    int nValue;
    float fValue;
};

Something sValue;

void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid
Run Code Online (Sandbox Code Playgroud)

但是,因为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
Run Code Online (Sandbox Code Playgroud)

来源:链接

  • 在C++中,最后三行会导致编译错误,因为与C不同,你必须将事物显式地转换为`void*`. (4认同)

Mar*_*som 23

void*如果要在不指定类型的情况下指示指向大块内存的指针,则使用指针.C malloc返回这样一个指针,期望你立即将它强制转换为特定类型.在将其转换为另一种指针类型之前,它确实没用.您应该知道要将其转换为哪种类型,编译器没有反射功能来知道底层类型应该是什么.

  • @ArkaMajumdar 隐式强制转换仍然是强制转换。指针的类型发生变化,这使得它变得有用。 (2认同)