c语言好难——关于形参传递中有const的情况

来源:互联网 发布:mac桌面文件夹灰色的 编辑:程序博客网 时间:2024/06/05 01:52

这是在逛论坛的时候看到的一个问题。

 

例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午 深圳


0 0