鉴于scanf在documentation from Microsoft中有(const char *)和this question的答案,当我为(char **)提升(const char *)做同样的事情时,我的目标是什么*)?
基本上为什么编译?
#include <stdio.h>
int main(int argc, char **argv)
{
char szArray[50];
int i = 0;
strcpy(szArray,"10");
/* the following code is upcasting the (char *) to (const char *) */
sscanf(szArray,"%d",&i);
return 0;
}
为什么不编译?
#include <stdio.h>
void processargs(const char **p)
{
}
int main(int argc, char **argv)
{
processargs(argv);
return 0;
}
两者似乎对指针做了同样的事情!
答案 0 :(得分:12)
char** -> const char **
很危险,因为您最终可能会意外修改基础const
对象。
写出你想要的东西的正确方法是:
void processargs(const char * const *p)
{
}
答案 1 :(得分:3)
您可以增加访问限制,但您无法减少访问限制。从普通指针到const指针很好,从const指针到普通指针不是。
第二个示例没有编译,因为您没有将指针转换为const指针,而是将指针转换为一种类型(char*
)到另一种类型(const char*
)。例如,您可以将char**
更改为char* const*
,而不是const char**
。
答案 2 :(得分:2)
检查这是否为您澄清:
char * a_mutable = /*...*/;
const char * a_constant = /*...*/;
char **pointer_to_mutable = &a_mutable; /* ok */
const char **pointer_to_constant = &a_constant; /* ok */
pointer_to_constant = pointer_to_mutable; /* oops, are you sure? */
*pointer_to_constant = a_mutable; /* valid, but will screw things around */
最后一行是有效的,因为pointer_to_constant
是指向常量字符的可变指针的可变指针,但是由于你使a_constant
指向a_mutable
,它会破坏事物。这就是为什么您不允许pointer_to_constant
收到pointer_to_mutable
的内容。
答案 3 :(得分:0)
您的第一个示例有效,因为您正在将char*
的 rvalues 转换为const char*
,这是正常的(主要是因为您无法分配给rvalues)。第二个没有,因为(非常量)指针的目标始终是左值。
只需尝试(可能借助编译器)您可以使用char**
执行哪些操作,这些操作与const char**
一起使用,并考虑是否以及哪些类型可以互换。