函数指针

/*{{{*/
/*
*    expression           error                          right                      说明
*
*     *p.f                (*p).f                         *(p.f)                     . 的优先级高于*  
*
*     int *ap[]           ap是一个指向int数组的指针      ap是一个指向元素为int指针   [] 高于 *
*                         int(*ap)[]                     的数组 int * (ap[])
*
*     int *fp()           fp是一个函数指针,所指函数     fp是一个函数,返回int*      函数() 高于*
*                         返回int int(*fp)()             int* (fp())
*
*    
*/

   char * const *(*nexta)();
    /* next是一个函数指针,所指函数返回一个指针,这个指针指向一个类型为char的常量指针 */
    char * const (*nextb)(); /* 与上面有什么区别? */

    char * (*nextc)();
    /* next 是一个函数指针,所指函数返回一个指针,这个指针返回类型: char *  */

    char *(*c[10])(int **p) ;
    /* c是一个数组,数组里的元素是函数指针a,a所指函数的参数类型是int** ,返回值是一   个指向char类型的指针*/
   
    char * (*funa(int*))(int* ) ;/* fun是一个函数指针, 所指函数参数类型 int* , 返回类型 char * (*fun)(int*)  */
   

    char * (*funb)(int*); /* fun是一个函数指针,所指函数的参数类型 int * , 返回类型 char *   */

    int(*func())(); /*  fun是函数指针,返回一个函数指针,这个这个函数指针所指的函数,返回值为int,无形参 */

    int(*fooa())[] ; /* foo是函数指针,返回一个指向数组的指针,这个数组里的元素类型是int */

    int(*foob[2])() ;
    /* foo是一个数组,数组里是函数指针a,a所指函数返回值是一个函数指针b,b所指函数返回值是int无形参 */
   
   int fooc[][3] /* 数组的数组 */
 
实例1:

#include <stdio.h>

/* 定义函数指针类型 */
typedef int (*PFUNCA)(int a );

/* 定义指针变量 */
PFUNCA pfa;  /* int (*pfa)(int a) */

/* 定义回调函数*/
int CallBack( int a ){
    return ++a;
}

/* 调用者函数 */
int Caller( PFUNCA cb,int a ) /* void Caller( int (*cb) ( int ) )  也可这样申明*/
{
    return  cb( a );
}

/* 定义函数指针的指针类型
*/
typedef int (**PPFUNCA) ( int aPara );

/* 调用者函数
*/
/*void PtrCaller( PPFUNCA cb );*/
int PtrCaller( int (**cb) ( int ) , int num ) // 原型申明
{
   return  (*cb)(num); // nRet = 1000;
}

/*  使用回调
*/
void Test(){
    /* 函数指针 */
    printf( "%d\n" , Caller( CallBack, 2 ) ); // 直接使用回调函数
    PFUNCA cb = CallBack; // int (*cb) ( int ); cb = CallBack;
    printf( "%d\n" , cb(99) );

    /* 函数指针的指针 */
    printf( "%d\n" , PtrCaller(&cb,20) );     /*  ok */
/* printf( "%d\n" , PtrCaller(&CallBack,20) );     error ???  */

    /* 指针数组 */
    PFUNCA  fArray[10]; /* int (*fArray[10]) ( int );  */

    int  i ;
    for ( i = 0; i < 10; i++ ){
        fArray[i] = CallBack;
        printf( "%d\t" ,  fArray[i](i) ) ;   
    }
}
int main()
{
    Test();
    return 0 ;
}

posted @ 2009-11-15 11:14  jackyxm  阅读(187)  评论(0)    收藏  举报