浅谈char **p与const char **p赋值问题

前段时间闲来无事就翻看了一下C专家编程,在第一章1.9 阅读ANSI C标准,寻找乐趣和裨益中作者给出了下面代码:

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

 上面代码在编译时会发出警告:argument is incompatible with prototype(参数与原型不匹配) 
  

其实在平时中我们更常见的是

char *cp
const char *ccp
ccp = cp
上面代码在编译时是没有警告的,对此我们提出疑惑,上述两种有什么不同吗?对此刚开始我很疑惑,然后上网找了个很多发现大家都是把原文直接复制下来了,没有加入的解释部分,呜呼。。。下面是自己的见解,欢迎大家交流交流


首先标准指出了参数传递类似于赋值,其次对于赋值操作,需满足下面条件左边操作数所指向的类型与右边操作数所指向的类型相同,左操作数所指向的类型必须有右操作数所指向类型的限定符(提示书中描述“必须满足下列条件之一”,此处书中进给出了一个条件其他条件未给出,意思就是要满足下面条件,大家不要在这个地方晕了)


对于第二个代码,首先左右操作数都指向了char类型,其次右操作数无限定符,所以符合

对于第一个代码,左右操作数指向的类型不同,左操作数指向const char* (此处const限制的是char而不是char *),而右操作数指向了char *。这类似于

int *p;
char *pp;
pp = p;
那怎样赋值才是正确的呢?下面赋值就符合了标准

左右操作数为char *(此处const限制的是char *),右操作数无限定符

foo(char *const*p) { }
main(int argc, char **argv)
{
     foo(argv);
}
左操作数指向了 char*,限定符为const,右操作数指向了char*,无限定符

顺便在此补充一下:

关键字const并不能把变量变成常量!const仅仅表示被修饰的符号不能被赋值,const意为onlyread



你可能感兴趣的:(--C语言专区)