先看一个例子
void fun(char *dest_str,const char *src_str){
strcpy(dest_str,src_str);
}
int main(void)
{
char dest_str[10]={0};
char src_str[]={"hello world"};
fun(dest_str,src_str);
return 0;
}
引出了一个思考,fun的第一个参数不加const,为什么第二个要加呢。
那是因为,fun函数的第一个新参是为了被修改,返回被复制后的字符串,
第二个参数是被复制字符串的源,这个数组是不能被修改的。
因为传递的是地址,存在被修改的风险,所以加了cosnt修饰,表明src_str指向的是”常量“不能被修改。
函数传参中为什么使用const指针
因为,函数传递地址遵循两个原则,一个是修改原则,然后是效率原则。如何实现这两个原则?
修改原则:利用传参来实现函数的返回值,一般情况下,如果是为了得到返回值,我们就传递地址,否则就传递普通值。
效率原则:对于数组和结构体来说,为了提高传参的效率,基本传递都是地址,传递地址就有可能被修改的风险,
但问题是有些传参只是使用其内容而不是要修改,这时候我们就可以加入const来锁定了。
再看看const的用法
既然说到了函数,以及传参
那函数为什么需要传参和返回值?
我们需要知道输入型参数和输出型参数,
函数传参和返回值的多种实现方式
1:以形参和返回值方式实现(提高封装性)
2.通过全局变量方式实现(提高效率)
两种方法各有好处吗,但我们为了函数的封装性,封装性才是很重要的,大部分情况下都是用第一种。
当使用了传参来实现函数的返回值的时候,函数的真正返回值,在绝大多数情况下,都是通过返回0或-1,来表明函数是执行成功或者失败。
在c语言的库函数和linux的系统函数中,大多都是这种情况,真正的返回值都是通过传参来实现的。
总结:形参里面,凡是只使用值的,我们都称号之为输入型参数,目的是为了传递函数需要用到的数值,如果这些参数里面涉及指针的时候(主要是数组和结构体),必须加入const修饰,防止被修改。如果希望通过形参返回某个值的时候,称为输出型参数,而且传递的必须是地址(指针),并且不能加const修饰。