void* 是一种特殊的指针类型,可用于存放任意对象的地址。一个 void* 指针存放着一个地址,这一点和其他指针类似。

void *主要使用在函数里,可以接受其他类型的指针,让函数使用起来更加便捷。
简单说一下 void 关键字使用规则:
void 类型;void;(常省略)void* ;void 的字面意思是“无类型”,void*则为“无类型指针”,void不能代表一个真实的变量,void体现了一种抽象。任何类型指针都可以直接赋值给void指针。
- double obj = 3.14; // obj 可以是任意类型的对象【此处为double】
- *pd = &obj;
- void* pv = &obj; // 正确,void* 能存放任意类型对象的地址【】
- pv = pd; // 正确,pv 可以存放任意类型的指针
- double obj = 3.14;
- *pd = &obj;
- void *pv = &obj;
-
- double *pd1 = pv; // 错误,不可以直接赋值
- double *pd2 = (double*)pv; // 必须进行显示类型转换
- cout << *pd2 << endl; // 3.14
- double obj = 3.14;
- *pd = &obj;
- void *pv = &obj;
-
- double *pd1 = pv; // 错误,不可以直接赋值
- double *pd2 = (double*)pv; // 必须进行显示类型转换
- cout << *pd2 << endl; // 3.14
- cout << (pv == pd2) << endl; // 1
我们对该地址中到底是个什么类型的对象并不了解,因此不能直接操作 void* 指针所指的对象,也就无法确定能在这个对象上做哪些操作。
概括来说,以 void* 的视角来看内存空间也就是仅仅是内存空间,没办法访问内存空间中所存的对象,因此只有对其进行恰当的类型转换之后才可以对其进行相应的访问。
也就是说一个 void* 指针必须要经过强制类型转换以后才有意义。
- double obj = 3.14;
- *pd = &obj;
- void *pv = &obj;
-
- cout << *(double*)pv << endl; // 3.14
- void *pv = 0;
- void *pv2 = NULL;
- cout << pv << endl; // 值为0x0
- cout << pv2<< endl; // 值为0x0
如果函数的参数或返回值可以是任意类型指针,那么应声明其类型为void*。
在函数调用过程中的使用 void 指针作为输入输出参数也非常好用,可以灵活使用任意类型的指针,避免只能使用固定类型的指针。
C++ void指针(void*)简介_W24-的博客-CSDN博客_c++ void*