3.函数的声明
1.若被调函数写在了主调函数后面,编译器会报”implici decla“,可以将该函数在主调函数前面声明
2.多文件使用函数时,需要对其声明,允许被其他文件调用
语法:
返回值 函数名(形参表);
4.函数的执行过程

保护现场:当函数要被调用时,pc寄存器会保存函数调用位置的下一条指令的地址保存在栈空间
恢复现场:当被调函数执行完时,通过出栈保护现场的地址,决定了cpu继续执行的位置在函数被调用的下一条指令
5.函数的传参(值传递)
1.函数传参过程,其实是实参向形参拷贝的过程,是单向的值传递,实参和形参各自有各自的内存空间
2.值传递:在被调函数中无法修改主调函数的变量
3.函数传参是自右向左的,如:
fun(get_val(num1),get_val(num2));
//会先执行get_val(num2)
6.函数的递归调用
定义:函数直接或间接自己调用自己
本质是循环
注意:1.递归要有出口,否则会成为死循环
2.递归调用内存开销大(栈内存),非必要少用
#include<stdio.h>
//递归求sum和
int get_sum(int n)
{
if(1==n)
{
return 1;
}
return get_sum(n-1)+n;
}
//递归求阶乘n!
int get_jiecheng(int n)
{
if(1==n)
{
return 1;
}
return get_jiecheng(n-1)*n;
}
int main()
{
printf("%d\\n",get_sum(100));
printf("%d\\n",get_jiecheng(5));
return 0;
}
7.函数和数组的关系
(1)函数和一维整型数组
传参方式:
定义:
返回值 函数名(int 数组名[],int len)
{
}
调用:
函数名(数组名,数组长度);
注意:
1.数组作为形参时,必须是数组类型:int a[ ], [ ]中的常量可有可无
2.数组作为函数参数传递时,本质是数组元素的首地址,所以形参的本质是一个地址,占8个字节
3.由于数组名传参本质传递的是首地址,所以必须要传递整型数组的长度
4.除了sizeof(数组名),数组在函数内和外面的使用方法一样



