函数分为:
1.库函数
2.自定义函数
函数的实参和形参:
实参:实参可以是常量、变量、表达式、函数等,只要能算出一个确定的值,就可以传给形参计算。
形参:形参的生命周期在函数被调用到调用结束之间,形参只在函数内生效。形参实例化后其实相当于实参的一份临时拷贝。
自定义函数格式:
使用自定义函数时,先写出函数的调用,再创造函数。
void返回类型函数:如果函数不返回任何一个变量时使用。
ret_type fun_name(paral,*)
{
statement;
}
ret_type函数的返回类型
fun_name函数名
paral,*函数参数
statement函数体
函数的调用:
函数的声明放在头文件中;定义放在源文件中。
函数在声明后可以写在主函数之后,但是如果没有声明直接调用定义在主函数之后的函数,会报错。如果函数在主函数之前,就不用声明,可以直接调用
①传值调用:函数的实参和形参分别占有不同的内存块,对形参的修改不会影响实参。
②传址调用:这种传参方式可以让函数和函数的外部变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量,同时也可以减少堆栈。
函数的部分规范:
①设计函数时尽量只使其完成单一的功能。
②函数中,只要上一步返回,之后的语句就不再执行。
③自定义函数如果不规定返回类型,则默认返回类型为int。
④不能在函数体中求数组的长度:函数中使用“实参”给“形参”传递数组时,要在形参的数组名后加方括号表示这是数组类型的形参,且传递时传给形参的仅为数组的第一个元素的地址,因此如果此时求传过来的数组的大小,仅仅为指针的大小“4”。故不能够在主函数创建数组后在函数中求数组的大小。
⑤在一个函数中不能定义另一个函数,但是可以调用。
链式访问:将一个函数的返回值作为另一个函数的参数。
例:int len =strlen(“abc”);
printf(“%d\n”,len);
化为:printf(“%d\n”,strlen(“”abc));
函数的递归:把一个大型复杂的问题层层转化为一个与原问题相似规模的小的问题来求解。
使用递归时会出现栈溢出的问题stack overflow:
每一次递归会在栈区使用一块区域,而栈区的空间有限,如果栈区被全部充满就无法继续为新的递归赋予空间,就会报错。所以在调用递归函数时:①不能写死递归,要设置跳出递归的条件,每次递归都要逼近跳出条件。②递归的层次不能过深。