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

本文探讨了C语言中关于形参传递时涉及`const`的情况。通过两个例子,解释了当形参为数组时,数组退化为一维指针,导致类型不匹配引发的编译错误。文章分析了`const`在形参和实参匹配中的作用,以及C语言赋值操作的要求,指出在形参传递中,需满足赋值操作的限制条件。

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

 

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值