foo(const char **p){};
main(int argc, char ** argv)
{
foo(argv);
}
warning: argument is incompatible with prototype
ANSIC:6.3.2.2
每个实参应该有自己的类型,这样它的值可以赋值给与它对应的形参类型的对象
ANSIC:6.3.16.1
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符
char *与const char *匹配
char * p;
const char *ccp;
ccp = cp;
原因:
1.左操作符(ccp)是一个指向有const限定符的char类型的指针,const限定符修饰的char类型(指针指向的类型)而不是修饰指针的。
2.右操作符(cp )是一个指向没有限定符的char类型的指针
3.char类型与char类型是相容的,左操作符所指向的类型具有右操作符所指向类型的限定符,再加上自身的限定符(const)
char ** 与const char **不匹配
char ** p;
const char **ccp;
ccp = cp;
原因:
1.ccp是一个指向有const限定符char类型的指针的指针;
2.cp是一个指向无限定符char类型的指针的指针;
3.cp和cpp指向的类型不相同。
关键字const不能把变量变为常量,在一个符号前加上const限定符只是表示符号不能被赋值,就是它的值对于这个符号是只读的,但它并不能防止通过程序的内部的方法来修改这个值。
const最常用之处就是用它限定函数的形参,这样函数将不会修改实参指针所指的数据。