const char** 与 char** 相容问题

foo(const char** p){}

main(int argc,char** argv){
foo(argv);
}

以上代码在编译时会发出一条警告信息
warning :argument is incompatible with prototype

为什么会发出这样的警告呢
要回答这个问题,其实还是挺麻烦的,但咱绝不是复制粘贴

首先形参作为左值,实参作为右值

若要使赋值合法,必须具有两个限定条件*(仅对指针而言,若不是指针,则简单多了)

1.两个操作数都是有限定符或者无限定符指针
2.左操作数的指针指向的内容必须具有右边操作数的指针所指向的内容的全部限定符,

带着以上两个原则,我们来分析一下如下代码

char* cp;
const char* ccp;
ccp = cpp;

左边操作数是指向const char 类型的指针
右边的操作数是指向char类型的指针
首先左右操作数都没限定符,另外const char 的本质是char 与右边的char兼容,const char作为左操作数指向的内容,比右边多了const限定符,当然其实就是说 右操作数限定符 包含于 左操作数限定符
所以以上代码完全符合条件

但是如果是这样呢

char** cp;
const char** ccp;
ccp = cp;

左边的操作数是指向char* 类型的指针
右边的操作数是指向const char* 类型的指针
所以这两个操作数都没有限定符(关于这点请学习一下const的使用规则,下面所说的话都跟这个有关系)
然后问题来了,const char* 与char* 为什么不相容呢
const char* 其实是指向const char的指针,char* 其实是指向 char的指针
也就是说指针类型不同,造成不兼容
我们比较一下,const char 与char 本质上都是char,只不过左边比右边多了const
const char* 与char的迷惑之处在于 const char 看似 是 char* 前加了const,但是请注意,const 是修饰char的,而不是指针的
若要使其成立,可以这么写
char** cp;
char*const * ccp;
ccp = cp;
这样const就是修饰指针的了,代码也就成立了

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值