基本概念
当一个的主函数太过庞大时,会将主函数按功能进行拆分,根据是否需要向外部提供接口,分为静态函数和普通函数,
普通的函数是跨文件可见的, 但是如果是静态函数的话他的可见范围会被缩小到本文件可见,外部文件是无法进行调用的。
static int max (int x, int y) { //函数体 }
//静态函数主要功能是可以缩小该函数的可见范围,减少函数重名的概率;
// 一般静态函数会被定义在头文件中,在需要使用的文件中可以包含该文件即可使用。
递归函数
如果一个函数内部有自己调用自己的语句,则它是递归函数。
注意:
emsp;1.递归函数必须有结束条件,不然会一直调用下去,将栈溢出,栈崩溃,最后导致程序异常退出;
emsp;2.递归函数包含两个过程,一个是逐层递进,和逐步递归。
/*倒序打印 */
void func( int num )
{
if (num > 1)
{
func(num-1);
}
printf("%d
" , num );
}
注意:
1.在递归函数使用的过程中,栈空间消耗非常大,递归的层次越多栈空间剩余空间间越少,很容易会把栈空间耗尽 。
2.在层层递进的过程中问题的规模,应该逐步减小,也就是某个形式参数应该逐步减小,每次递归判断该形式参数是否满足返回条件。
回调函数
 每个函数都有一个入口地址,但调用此地址时就会调用此函数。函数指针就是用来保存函数的入口地址的,当函数的实现方不方便直接调用某个功能,可将函数的入口地址传递给函数指针,调用此函数指针便可以间接调用原来的函数,这种调用方式称为回调函数。
bool func_1( int (*p) (int ,int ));
int func_2(int a , int b);
int main(int argc, char const *argv[])
{
bool a = func_1(func_2);//func_2是一个函数的地址
if (a)
{
printf("函数调用成功 !!
");
}
else
{
printf("函数调用失败 !!
");
}
return 0;
}
bool func_1( int (*p) (int ,int ) )
{
if ( NULL == p )
{
// 先判断p是否指向一个NULL
return false ;
}
printf("我在函数1 !!
");
int num = p(103 , 229);//通过函数指针P来调用函数func_2
printf("num:%d
" , num);
return true ;
}
int func_2(int a , int b)
{
return a<b ? a:b ;
}
注意:
1.传递和接收函数地址时&,*可省略。
//幂运算
int exponentiation(int n, int i)
{
if(i == 0)
{
return 1;
}
else
{
return exponentiation(n, i-1)*n;
}
}
//阶乘
int Factorial(int n)
{
if(n == 1)
{
//使递归结束的条件
return 1;//1! 等于1
}
else
{
//使递归进行的条件
return(Factorial(n-1) * n);//n! = (n-1)! * n;
}
}