如何将值放入 const char **?
如果我声明一个变量 const char ** stringTable,如果它是 const,我应该如何向它添加值? (它必须是 const,因为我应该使用的函数采用 const char ** 作为参数。)
编辑: 不,您不能隐式从 char ** 转换为 const char **。 编译器抱怨: 无法将参数 3 从“char **”转换为“const char **”
If I declare a variable const char ** stringTable, how should I be able to put values to it if it is a const? (It has to be const because a function I am supposed to use takes const char ** as a parameter.)
Edit:
No you cannot convert from char ** to const char ** implicitly. Compiler complains:
cannot convert parameter 3 from 'char **' to 'const char **'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
哇,我很惊讶没有人得到这个! 也许我可以获得死灵法师徽章。 隐式 const 转换仅扫描一层深度。 因此,
char*
可以变成const char*
,但它不会深入挖掘char**
类型来找到需要的内容进行更改以使其成为const char**
。Wow, I'm surprised nobody got this! Maybe I can get a necromancer badge. Implicit const casting only scans one level deep. So a
char*
can become aconst char*
but it won't dig deep enough inside the achar**
type to find what needs to be changed to make it aconst char**
.除了其他提到的,您可以将
char**
传递到采用const char **
的函数中,const char**
是一个非常量指向const char*
的指针,您可以声明它并在其中自由放置const char*
类型的值。另一方面,如果您将其声明为
const char * const *
或const char * const * const
,则您将无法执行此操作。cdecl
的内容如下:Apart from other mentions that you can pass
char**
into function that takesconst char **
,const char**
is a non-const pointer toconst char*
, you can declare it and freely put values of typeconst char*
in it.On the other hand, you would not be able to do it, if you declared it as
const char * const *
orconst char * const * const
.Here is what
cdecl
says:该 const 声明是函数的保证,您不必完成它。 这意味着该函数将使您的数组保持不变(它只会读取)。 因此,您可以将非常量变量传递给需要常量的函数。
That const declaration is a quarantee of the function, you dont have to fullfill it. That means the function will keep your array untouched (it will just read). So you can pass a nonconst variable to a function expecting const.
您可以将
char **
传递给声明为采用const char **
的函数 - 可能值得一看 MSDN 上的 const 文档You can pass a
char **
to a function declared as taking aconst char **
-- Might be worth taking a look at the documentation for const on MSDNchar **
可以转换为const char **
,因此如果您想调用一个采用const char * 的函数*
作为参数,只需提供您的char **
即可隐式转换。如果您想编写一个函数,该函数采用
const char **
作为参数,然后修改它引用的char
数据,那么您就破坏了与你的编译器的合同,即使你可以通过强制转换让它工作!char **
can be converted toconst char **
, so if you want to call a function which takes aconst char **
as a parameter, just supply yourchar **
and it'll be implicitly converted.If you want to write a function which takes a
const char **
as parameter and then modifies thechar
data it references, you're breaking the contract with your compiler, even if you might get it to work via casts!使用我的编译器(cygwin 中的 gcc 版本 3.4.4),我发现我可以将
char *
传递给const char *
,但不能将char ** 到
const char **
,与大多数答案所说的不同。这是构建可行的东西的一种方法; 也许它会对你有帮助。
With my compiler (gcc version 3.4.4 in cygwin), I found that I could pass
char *
toconst char *
, but notchar **
toconst char **
, unlike what most of the answers are saying.Here is one way you can build something up that works; maybe it will help you.
您可以使用强制转换运算符来取消 const char* : (char*)
对数组 char** 使用相同的想法
you can un-const char* by using a cast operator: (char*)
use the same idea with the arrays char**
const char **
表示底层字符是常量。 所以,虽然你不能做这样的事情:但是没有什么可以阻止你操作指针本身:
也就是说,如果你确实想修改实际的字符数据,你可以使用非常量指针并强制转换它:
const char **
indicates that the underlying character is constant. So, while you can't do something like this:but there is nothing preventing you from manipulating the pointer itself:
That said, if you did want to modify the actual character data, you could use a non-const pointer and cast it: