函数与函数指针

  在学习C++的回调函数机制时有一个关于函数名和函数指针的疑惑,如是就自己研究了下二者的关系。

  快速排序的原型:

  void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));

  可见qsort接受一个类型为_USERENTRY的函数指针fcmp,但是下面代码中qsort函数接受一个函数名,却不是一个函数指针。而函数名和函数指针的关系如何呢?

 

代码
#include  < stdio.h >  
#include 
< stdlib.h >  

int  sort_function(  const   void   * a,  const   void   * b); 
int  list[ 5 =  {  54 21 11 67 22  }; 

int  main( void

   
int  x; 

   qsort((
void   * )list,  5 sizeof (list[ 0 ]), sort_function); 
   
for  (x  =   0 ; x  <   5 ; x ++
   printf(
" %i\n " , list[x]); 
   
return   0


int  sort_function(  const   void   * a,  const   void   * b) 

   
return   * ( int * )a -* ( int * )b; 
}

  函数指针实际上就是该函数代码段开始的地址。其实,编译器对于函数名、函数指针都是转换为一个地址,这个地址就是该函数代码起始地址。

  下面的代码说明了函数名和函数指针的关系:

代码
#include < stdio.h >

void  MyFun( int  x);
typedef 
void  ( * FunP)( int ); 

FunP fp1 
=  NULL, fp2  =  NULL, fp3  =  NULL, fp4  =  NULL ;

int  main( int  argc,  char *  argv[])
{
   MyFun(
10 );                         // 这里是调用MyFun(10);函数

   fp1
=& MyFun;                        // 将MyFun函数的地址赋给FunP变量
  ( * fp1)( 20 );                         // 通过函数指针变量FunP来调用MyFun函数的。                        

   fp2
=& MyFun;                        
   fp2(
30 );    

   fp3
= MyFun;                        
   fp3(
40 );    

   fp4
= MyFun;  
   (
* fp4)( 50 );   

   
return   0 ;
}

void  MyFun( int  x)                      // 这里定义一个MyFun函数
{
   printf(
" %d\n " ,x);
}

1. 可见,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。
2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用        (这样方便多了并与数学中的函数形式一样)。
3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。

 

 


 

你可能感兴趣的:(函数指针)