【问题标题】:pointer to void指向无效的指针
【发布时间】:2012-04-02 04:57:56
【问题描述】:

这是一种基本的,但我似乎无法掌握这一点。参考here

void *pconst void *p 是否足够不同?为什么函数会使用const void * 而不是void *

【问题讨论】:

  • 有什么不同?
  • 我的意思是,拥有 'const void *' 这样的东西有意义吗?
  • 是的,它是一个指向未知类型的不可变对象的指针。

标签: c++ pointers void


【解决方案1】:

完全使用void* 的原因(无论是否const)是它提供的通用性。它就像一个基类:所有指针 都是 void* 并且可以隐式转换为它,但从void* 转换为类型化指针必须显式地手动完成。

通常,C++ 提供了更好的方法来执行此操作(即 OO 和模板),因此使用 void* 根本没有多大意义,除非您与 C 交互。但是,如果您使用它,然后const 提供了它在其他地方提供的功能:您需要一个(附加的)const_cast 才能更改引用的对象,因此您不太可能意外更改它。

当然,这取决于您不使用 C 风格的强制转换,而是使用显式的 C++ 强制转换。从void* 到任何T* 的转换需要static_cast,这不允许删除const。因此,您可以使用static_castconst void* 转换为const char*,但不能转换为char*。这将需要一个额外的const_cast

【讨论】:

  • 不错的答案,但我认为这不是所要求的。这是 const 和非 const 版本的区别。
  • 我相信从void * 转换到T * 需要static_castreinterpret_cast 始终由实现定义,应避免使用。
  • 我认为OP知道const的含义,他只是说他不明白const void的具体含义。所以我认为这是一个很好的答案。顺便说一句,好好利用reinterpret_cast
  • @Diego:我想我已经写过 const void* 有用的原因与任何其他 const 有用的原因相同:防止意外更改对象。老实说,我不知道如何更明确地说明这一点。能详细点吗?
  • 最后一段是错误的,你应该更正它,从void*void*的转换是用static_cast§5.2.9[expr.static.cast]/10
【解决方案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

【讨论】:

    【解决方案3】:

    有一个简单的区别。如前所述,由于其更好的类型系统、模板等,在 C++ 中几乎不需要使用 void*。但是,当与 C 或系统调用接口时,有时需要一种方法来指定没有已知类型的值.

    正如您所问的,void*const void* 之间的区别是向您显示指向内存的内容是否会在您调用的函数中被修改的提示,const 意味着它将有一个只读访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2012-07-23
      • 2023-03-17
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多