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

时间:2017-02-02 07:18:24

标签: c++ type-conversion const extern-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-Arrays的练习中出现了我的问题。由于C,我不得不传递一个带有const void*参数的函数指针。在这种情况下,它指向一个C字符串数组。为了将它转换为正确的类型,我必须将const转换掉。在C ++中有没有办法得到像“(const char *)*”`指针?

这样的东西

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

  

从'const void *'类型reinterpret_cast到'const char **'类型转换掉限定符

(const*)*,它会产生语法错误

  

''''

之前的预期类型说明符

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

虽然我在这里,有时候在C ++中使用C结构有什么优点,或者如果可能的话应该总是避免它们?我只用C ++中的C代码做了一些小规模的运动问题,但它已经引起了不少令人头疼的问题,迫使我在引擎盖下看得很紧,即使我在生活中写了大量的C代码。 或者您更愿意使用extern C限定符并在纯C中编写C代码吗?

2 个答案:

答案 0 :(得分:4)

那将是char* const *

双指针中有三个位置放置const:

const char**

指针指向一个你无法改变的角色。

char *const *

指针,指向一个无法改变的指针,指向一个角色。

char ** const

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

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

答案 1 :(得分: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 *