基本上我想知道是否像
这样的东西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代码吗?
答案 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);
如果你愿意,你甚至可以删除第一个const
(这很有意义)。
说明:
const void * a
表示a
指向void
的某个内容(const
)。因此,如果将a
转换为另一个指针,它也必须指向const
的内容。在您的情况下,您将其转换为指向char*
的指针。因此,char*
必须为const
。创建常量指针(不指向常量的指针)的语法是将const
放在*
的右侧。因此,char* const *
。