C语言学习之函数
函数的声明
声明:
- 当被调函数定义在主调函数的后边,编译器”implicit declration”,可以将该函数在主调函数前边进行声明
- 多文件使用函数时,需要对其进行声明,允许被其它文件调用
语法:
返回值 函数名(形参表);
- 函数的调用过程
函数在调用的时候存在保护现场和恢复现场的操作:
保护现场:当函数要被调用的时候,会将函数调用位置的下一条指令地址保存在栈空间;
恢复现场:当被调函数执行完时,通过出栈保护现场的地址,决定cpu继续执行的位置在函数被调用的下一条指令位置
函数的传参
1. 函数传参过程,其实是实参向形参拷贝的过程,实参有实参的空间,形参有形参的空间(值传递)。
2. 值传递:在被调函数中,无法修改主调函数中的变量。
3. 函数传参的顺序:自右向左。
函数的递归调用
递归调用:函数直接或间接的调用自己
本质:是一种循环方式
注意:
1. 递归要有递归的出口,否则会成为死循环。
2. 递归调用系统开销比循环大(比如:栈内存)。
函数一维整型数组
传参方式:
定义:返回值 函数名(数组类型 数组名[],int len)
{
//外面数组怎么使用,函数内数组就怎么使用
}
调用:
函数名(数组名,数组长度);
注意:
- 数组作为函数参数传递时,形参必须要是数组类型;int a[],[]中的常量可有可无
- 2.数组作为函数参数传递时,本质传递的数组首元素地址,所以形参本质是一个地址,是数组的起始地址
- 由于数组名传参本质传递的是首地址,所以把必须要传递整形数组的长度
- 数组作为函数参数传递给被调函数后,函数内部的使用方法和外面一样,除了sizeof(数组名)