我可以在 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);
如果需要,您甚至可以删除第一个 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
您无法更改的指针,指针,字符。
您可以将它们混合使用以构成不同的部分。
基本上我想知道是否像
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);
如果需要,您甚至可以删除第一个 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
您无法更改的指针,指针,字符。
您可以将它们混合使用以构成不同的部分。