C++ 什么是C++;?

C++ 什么是C++;?,c++,void-pointers,C++,Void Pointers,可能重复: 我经常看到类似以下内容的代码: void*foo(整型条) 这是什么意思?这是否意味着它可以归还任何东西?这与C#中的dynamic或object类似吗?一个void*可以指向任何东西(它是一个没有任何类型信息的原始指针)。一个void*指针用于指示指向大量内存的指针,而不指定类型。C的malloc返回这样一个指针,希望您立即将其转换为特定类型。直到您将它转换为另一个指针类型,它才真正有用。您需要知道将其转换为哪种类型,编译器没有反射功能来知道基础类型应该是什么。Void用作关键字

可能重复:

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

void*foo(整型条)


这是什么意思?这是否意味着它可以归还任何东西?这与C#中的
dynamic
object
类似吗?

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

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

Void用作关键字。 void指针,也称为通用指针,是一种特殊类型的指针,可以指向任何数据类型的对象!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
int nValue=5;
void*pVoid=&n值;
//无法取消对pVoid的引用,因为它是空指针
int*pInt=static_cast(pVoid);//从void*转换为int*

coutA
void*
没有任何意义。它是一个指针,但它指向的类型未知

并不是说它可以返回“任何东西”。返回
void*
的函数通常执行以下操作之一:

  • 它正在处理未格式化的内存。这就是
    operator new
    malloc
    返回的内容:指向特定大小内存块的指针。因为内存没有类型(因为内存中还没有正确构造的对象),所以它是无类型的。IE:
    void
  • 它是一个不透明的手柄;它引用已创建的对象而不命名特定类型。执行此操作的代码通常格式不好,因为最好是通过向前声明结构/类,而不为其提供公共定义。因为,至少它有一个真正的类型
  • 它返回一个指向包含已知类型对象的存储器的指针。但是,该API用于处理各种类型的对象,因此在编译时无法知道特定调用返回的确切类型。因此,将有一些文档解释它何时存储哪种类型的对象,以及您可以安全地将其转换为哪种类型
这个构造与C#中的
动态
对象
完全不同。这些工具实际上知道原始类型是什么<代码>无效*
不可用。这使得它比任何一种用法都要危险得多,因为它很容易出错,而且无法询问某个特定用法是否正确


个人注意,如果你看到代码经常使用
void*
,你应该重新思考你在看什么代码<代码>虚空*/COD>用法,尤其是C++,应该很少见,主要用于处理原始内存。< /P>链接到类似的问题:它与<代码>动态< /C>没有关系,只是与“代码>对象< /代码>的“大体相似”。@ ChrisFarr,不能通过删除重复通知重新打开这个问题。它只会隐藏这是针对哪个问题的。如果您觉得应该重新打开,请考虑在Meta上创建一个POST。任何指针都可以指向任何东西。@ AJ.C++的任何指针都可以引用C++中内存中的任何位置,最后三行将导致编译错误,因为您必须将内容明确地映射到<代码> Value*/Cudio>,与C不同。@User1988请学习如何编辑您的帖子。代码示例目前有效,谢谢。对我来说,这个问题和前2个答案比链接的“重复”更简洁、更明确。最好、更完整的答案有必要明确说明函数指针是无效指针的例外!好吧,C的
malloc
实际上并不期望您立即将其转换为其他类型,因为在C中,
void*
会自动升级为真正的指针类型:。C++是一个不同的故事,但是你应该在C++中使用<代码>新的< /代码>。指针的类型发生了变化,这使它变得有用。感谢+1将void*比作C#/Java
Object