函数

##基本概念
 当一个的主函数太过庞大时,会将主函数按功能进行拆分,根据是否需要向外部提供接口,分为静态函数和普通函数,
普通的函数是跨文件可见的, 但是如果是静态函数的话他的可见范围会被缩小到本文件可见,外部文件是无法进行调用的。

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.在层层递进的过程中问题的规模,应该逐步减小,也就是某个形式参数应该逐步减小,每次递归判断该形式参数是否满足返回条件。

##回调函数
 每个函数都有一个入口地址,但调用此地址时就会调用此函数。函数指针就是用来保存函数的入口地址的,当函数的实现方不方便直接调用某个功能,可将函数的入口地址传递给函数指针,调用此函数指针便可以间接调用原来的函数,这种调用方式称为回调函数。

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;
      }
}
posted @ 2020-12-05 09:39  ding-ding-light  阅读(83)  评论(0编辑  收藏  举报