我可以在 C++ 中的 const 指针上有一个指针吗?

Can I have a pointer on pointer on const in C++?

基本上我想知道是否像

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),结果是

reinterpret_cast from type ‘const void*’ to type ‘const char**’ casts away qualifiers

(const*)*,给出语法错误

expected type-specifier before ‘(’ token

这是一个纯学术问题。我知道,使用 std::string#include <algorithm>.

可以更轻松、更省力地解决问题

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

我相信这就是您要找的:

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 *.

那将是 char* const *

一个双指针有3个地方放const:

const char**

指针,指向指针,指向无法更改的字符。

char *const *

指针,指向无法更改的指针,指向字符。

char ** const

您无法更改的指针,指针,字符。

您可以将它们混合使用以构成不同的部分。