这是一种基本的,但我似乎无法掌握这个。参考这里
void *p
和const void *p
足够不同?为什么要使用函数const void *
而不是void *
?
完全使用的原因void*
(无论是否const
)是它提供的那种通用性。它就像一个基类:所有指针都 void*
可以并且可以隐式转换到其中,但是从void*
类型化指针转换必须显式地手动完成。
通常,C++ 提供了更好的方法来做到这一点(即 OO 和模板),所以使用它根本没有多大意义void*
,除非你在与 C 接口时。但是,如果你使用它,那么它const
提供了什么它在其他地方提供:您需要一个(附加的)const_cast
才能更改所引用的对象,因此您不太可能意外更改它。
当然,这取决于您不使用 C 风格的强制转换,而是使用显式的 C++ 强制转换。转换fromvoid*
到 anyT*
需要 a static_cast
,这不允许删除const
. 因此,您可以const void*
转换为const char*
using static_cast
,但不能转换为char*
。这将需要一个额外的const_cast
.
在 c++ 中,指针前面的 const 表示不应更改指针地址处的数据。即它阻止某人这样做:
int v1 = 3;
int v2 = 4;
const int *pv = &v1;
pv = &v2 // ok;
*pv = 5; // error
您还可以将指针值本身设为 const:
int v1 = 3;
int v2 = 4;
int * const pv = &v1;
*pv = 5; // ok
pv = &v2; // error
您也可以将两者结合起来:
int v1 = 3;
int v2 = 4;
const int * const pv = &v1;
*pv = 5; // error
pv = &v2; // error
有一个简单的区别。如前所述,void*
由于其更好的类型系统、模板等,几乎不需要在 C++ 中使用。但是,当与 C 或系统调用接口时,有时需要一种方法来指定没有已知类型的值。
void*
如您所问,和之间的区别const void*
是向您显示指向内存的内容是否将在您调用的函数中被修改的提示,这const
意味着它将具有只读访问权限。