这是在逛论坛的时候看到的一个问题。
例1:
char *ptr;
void demo(const char* p)
{
;
}
int main(void)
{
demo(prt);
}
编译后不报错。
例2:
char *ptr[];
void demo(const char* p[])
{
;
}
int main(void)
{
demo(prt);
}
编译后报错,..\APP\main.c(37): error: #167: argument of type"char *" is incompatible with parameter of type "const char**" ,错误意为形参传递不合适。
先分析例2:
报错原因是形参与实参的指针类型不一致。
以下是原因分析,在c语言中,形参为数组时候,会退化为一维指针,所以const char* p[] 等价于 const char **p,
当 *prt[] 变量作为形参传递的时候,等价于 char **ptr,
当执行demo(ptr)的时候,实参传递给形参,等价于实参赋值给形参,即下面这条语句,
**p = **ptr;
本质上是两个指针数值的传递,但是形参是指向const char类型 的指针,而实参是指向 char p类型的指针,由于两个指针的类型不一致,报错。
然后是例1:
本质上等价于*p = *ptr;
形参p指向const char类型的变量,实参是指向char类型的变量,两种变量的类型是一致的,且满足赋值语句的限制项的要求,不报错。
这里要理解两件事情:
1、 指针是不存在限制项的;
2、 函数形参传递类同于变量初始化;
例2中的“指针指向const char 的指针”这句话里面的“const char的指针”就是指针的类型,而实参的指针类型是“指向char 的指针”,两者的类型不一致,所以报错。而例1中的是实参传递给形参,是两个变量间的赋值操作,变量是有限制项。在例1中形参为char型变量,实参也为char型变量,两者均为char型变量,满足了c语言赋值操作的一个条件,而形参,即左操作符的有const限制项,实参没有,符合c语言中的赋值操作中的左操作符需要包含右操作符的限制项的要求。(这里的参考文献请看c89中关于赋值的介绍)
关于c语言的赋值需要满足以下的要求(C89)
以上均为一家之言,如果错误,恳请斧正。
写于2017-2-6午 深圳