2

基本上我想知道是否像

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-Arrays 的练习中提出的。因为 C,我不得不传递一个带const void*参数的函数指针。在这种情况下,它指向一个 C 字符串数组。要将其转换为正确的类型,我必须将 const 丢弃。C++ 中有没有办法获得类似“(const char*)*”的指针?

我已经尝试过const char**(没有 const_cast)产生

reinterpret_cast 从类型 'const void*' 到类型 'const char**' 抛弃限定符

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

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

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

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

4

2 回答 2

4

那将是一个char* const *.

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

const char**

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

char *const *

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

char ** const

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

你可以混合这些来制作不同的部分。

于 2017-02-02T07:21:54.517 回答
2

我相信这就是您正在寻找的:

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

[现场示例]

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

解释:

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

于 2017-02-02T07:21:38.133 回答