• 函数指针


    用途: 
    函数指针通常用来实现回调,也可以用来对模块调用以函数表的形式进行优化。 
    使用方法: 
     1、定义函数指针类型 
    使用typedef更直观更方便 
    // 定义一个原型为int Fun( int a );的函数指针 
    typedef int (*PTRFUN) ( int aPara ); 
    typedef的功能是定义新的类型。这里定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。 
     2、函数指针变量的定义 
    PTRFUN pFun; // pFun 为函数指针变量名 
    int (*pFun2) ( int a ); // pFun2也是函数指针变量名 
    3、函数指针作为函数的参数传递 
    // 定义回调函数 
    int CallBack( int a ) 
    { 
    return ++a; 
    } 
      
    // 定义回调者函数 
    void Caller( PTRFUN cb ) 
    // void Caller( int (*cb) ( int ) ) // 也可这样申明 
    { 
    int nPara = 1; 
    int nRet = cb( nPara ); 
    } 
      
    // 使用回调 
    void Test() 
    { 
    Caller( CallBack ); // 直接使用回调函数 
    PTRFUN cb = CallBack; // int (*cb) ( int ); cb = CallBack; 
    int nRet1 = cb( 99 ); // nRet1 = 100; 
    } 
    4、函数指针的指针使用 
    // 定义函数指针的指针 
    typedef int (**PTRPTRFUN) ( int aPara ); 
    // 函数指针的指针作为参数 
    void PtrCaller( PTRPTRFUN cb ) 
    // void PtrCaller( PTRFUN* cb ) // 指针申明 
    // void PtrCaller( int (**cb) ( int ) ) // 原型申明 
    { 
    int nRet = (*cb)(999); // nRet = 1000; 
    } 
      
    // 使用函数指针的指针 
    void Test() 
    { 
    PTRFUN cb = CallBack; 
    PtrCaller( &cb ); 
    } 
    5、函数指针数组的使用 
    // 函数指针数组的定义 
    PTRFUN fArray[10]; 
    // int (*fArray[10]) ( int ); // 原型定义 
    for ( int i = 0; i < 10; i++ ) 
    { 
    fArray[i] = CallBack; 
    int nRet = fArray[i](i); // nRet = i+1; 
    } 
    使用实例: 
    这里给出一个使用函数指针的简单例子: 
    //------------------------------------------------------ 
    #include 
      
    typedef int (*PTRFUN) ( int aPara , int bPara); 
      
    int func1(int Pa, int Pb); 
    int func2(int Pa, int Pb); 
    int func3(int Pa, int Pb); 
    int func4(int Pa, int Pb); 
      
    void main() 
    { 
    int i = 0; 
    int j = 0; 
    PTRFUN pFuncArray[4] = {func1, func2, func3, func4}; 
    PTRFUN pFunc; 
      
    for(i = 3; i >= 0; i --) 
    { 
    pFunc = pFuncArray[i]; 
    printf("Output is: %d 
    ", (*pFunc)(i,i)); 
    } 
    } 
      
    int func1(int Pa, int Pb) 
    { 
    printf("func1 with input para %d, %d 
    ", Pa, Pb); 
    return Pa + Pb; 
    } 
      
    int func2(int Pa, int Pb) 
    { 
    printf("func2 with input para %d, %d 
    ", Pa, Pb); 
    return Pa - Pb; 
    } 
      
    int func3(int Pa, int Pb) 
    { 
    printf("func3 with input para %d, %d 
    ", Pa, Pb); 
    return Pa * Pb; 
    } 
      
    int func4(int Pa, int Pb) 
    { 
    printf("func4 with input para %d, %d 
    ", Pa, Pb); 
    return (Pb == 0)? 0xffff : (Pa / Pb); 
    } 
    输出为: 
    func4 with input para 3, 3 
    Output is: 1 
    func3 with input para 2, 2 
    Output is: 4 
    func2 with input para 1, 1 
    Output is: 0 
    func1 with input para 0, 0 
    Output is: 0
  • 相关阅读:
    可重入与不可重入
    clash for windows的一些常用使用方法
    解决php7 表单提交不了太多元素
    CppSQLite3 的一些容易错误点
    Dckerfile CMD不同格式的区别
    async/await的理解
    CSS 学习三
    css学习一
    css学习二
    css学习四
  • 原文地址:https://www.cnblogs.com/lovebay/p/13895458.html
Copyright © 2020-2023  润新知