这是基本的,但我似乎无法抓住这一个。参考here
void *p
和const void *p
是否有足够的不同?为什么函数会使用const void *
而不是void *
?
答案 0 :(得分:6)
完全使用void*
的原因(无论是否const
)是它提供的通用性。它就像一个基类:所有指针都是 void*
并且可以隐式地转换为它,但是从void*
到类型化指针的转换必须是显式和手动完成的。
通常,C ++有更好的方法可以提供这样做(即OO和模板),所以使用void*
根本没有意义,除非你正在连接C.但是,如果你使用它,然后const
提供它在其他地方提供的内容:你需要一个(额外的)const_cast
来改变所引用的对象,这样你就不太可能意外地改变它。
当然,这取决于你不使用C风格的演员表,而是使用显式的C ++演员表。从void*
到任意T*
的广告需要static_cast
,这不允许删除const
。因此,您可以使用const void*
将const char*
投射到static_cast
,但不能投放到char*
。这需要额外的const_cast
。
答案 1 :(得分:2)
在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
答案 2 :(得分:1)
有一个简单的区别。正如其他所述,由于其更好的类型系统,模板等,几乎不需要在C ++中使用void*
。但是,当与C或系统调用接口时,有时需要一种方法来指定一个没有的值已知类型。
正如您所问,void*
和const void*
之间的区别在于提示您是否将在您正在调用的函数中修改指向内存的内容,{{1}这意味着它将具有只读访问权限。