假设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;
}两者似乎都在对指针做同样的事情!
发布于 2009-04-19 23:39:31
char** -> const char **是危险的,因为您可能会意外地修改底层的const对象。
编写你想要的东西的正确方法是:
void processargs(const char * const *p)
{
}发布于 2009-04-19 23:36:28
你可以增加访问限制,但你不能减少它。从普通指针转换为常量指针是可以的,但从常量指针转换为普通指针就不是那么好了。
第二个示例无法编译,因为您没有将指针转换为常量指针,而是将指针从一种类型(char*)转换为另一种类型(const char*)。例如,您可以将char**更改为char* const*,但不能更改为const char**。
发布于 2009-04-20 00:00:54
检查以下内容是否对您有帮助:
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的内容。
https://stackoverflow.com/questions/766386
复制相似问题