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