【问题标题】:Can I have a pointer on pointer on const in C++?我可以在 C++ 中的 const 指针上有一个指针吗?
【发布时间】:2017-06-19 04:09:04
【问题描述】:

基本上我想知道是否像

f(const void* a){
  // This is also what `(char**) a` would do behind the scenes
  char** string_a_ptr {reinterpret_cast<char**>(const_cast<void*>(a))}; 

  // ...

在保留const 限定符的情况下是可能的。

我的问题是在关于 C++ 中的 C 数组的练习中提出的。由于 C,我必须传递带有 const void* 参数的函数指针。在这种情况下,它指向一个 C 字符串数组。要将其转换为正确的类型,我必须将 const 丢弃。 C++ 中有没有办法获得类似“(const char*)*”的指针?

我已经尝试了 const char**(没有 const_cast),它产生了

从“const void*”类型到“const char**”类型的重新解释转换抛弃了限定符

(const*)*,它给出了一个语法错误

“(”标记之前的预期类型说明符

这是一个纯粹的学术问题。我知道,使用std::string#include &lt;algorithm&gt; 可以更轻松、更省钱地解决问题。

当我这样做时,有时在 C++ 中使用 C 构造是否有优势,或者是否应该尽可能避免使用它们?我只用 C++ 中的 C 代码做了一些小规模的练习题,但它已经引起了相当多的头痛,并迫使我仔细研究引擎盖下的内容,即使我已经编写了相当多的 C 代码。 还是您更愿意推荐使用extern C 限定符并用纯C 编写C 代码?

【问题讨论】:

  • const void* 将是 char* const*。 (如果您始终如一地定位 const 限定符,则更明显:void const*。)
  • 我明白了。将其重写为void const* 正是解决我的困惑的方法。谢谢!
  • "有时在 C++ 中使用 C 构造是否有优势" 是的。但是您应该始终尽量避免它们,并了解 C 构造在可读性、类型正确性或可维护性方面花费了多少。如果是void*,这三个你都输了。

标签: c++ type-conversion constants extern-c


【解决方案1】:

那就是char* const *

双指针中有三个地方可以放 const:

const char**

指针,指向一个指针,指向一个你不能改变的字符。

char *const *

指针,指向一个不能改变的指针,指向一个字符。

char ** const

你不能改变的指针,指针,字符。

您可以将它们混合在一起以使不同的部分成为常量。

【讨论】:

    【解决方案2】:

    我相信这就是您要找的:

    const char * const * string_a_ptr = static_cast<const char * const *>(a);
    

    [Live example]

    如果你愿意,你甚至可以删除第一个 const(这是有道理的)。

    解释:

    const void * a 表示a 指向某物(void),即const。因此,如果将a 转换为另一个指针,它也必须指向const。在您的情况下,您将其转换为指向char* 的指针。因此char* 必须是const。创建常量指针(不是指向常量的指针)的语法是将const 放在* 的右侧。因此,char* const *

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多