首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么允许从(char *)升级到(const char *)?

为什么允许从(char *)升级到(const char *)?
EN

Stack Overflow用户
提问于 2009-04-19 23:31:52
回答 4查看 740关注 0票数 4

假设scanf在documentation from Microsoft中有(const char *),并且this question的答案是,当我为(char **)提升到(const char **)做同样的事情时,到底发生了什么?

基本上为什么会这样编译呢?

代码语言:javascript
复制
#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;  
}

为什么这个不能编译?

代码语言:javascript
复制
#include <stdio.h>
void processargs(const char **p)
{ 
}
int main(int argc, char **argv)
{
    processargs(argv);          
    return 0;  
}

两者似乎都在对指针做同样的事情!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-19 23:39:31

char** -> const char **是危险的,因为您可能会意外地修改底层的const对象。

编写你想要的东西的正确方法是:

代码语言:javascript
复制
void processargs(const char * const *p)
{ 
}
票数 12
EN

Stack Overflow用户

发布于 2009-04-19 23:36:28

你可以增加访问限制,但你不能减少它。从普通指针转换为常量指针是可以的,但从常量指针转换为普通指针就不是那么好了。

第二个示例无法编译,因为您没有将指针转换为常量指针,而是将指针从一种类型(char*)转换为另一种类型(const char*)。例如,您可以将char**更改为char* const*,但不能更改为const char**

票数 3
EN

Stack Overflow用户

发布于 2009-04-20 00:00:54

检查以下内容是否对您有帮助:

代码语言:javascript
复制
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的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/766386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档