zoukankan      html  css  js  c++  java
  • C基础--函数指针的使用

    之前在看代码的时候,看了函数指针的使用,大体分为如下几类:

    • 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰;
    • 函数指针作为另一个函数的参数,用作回调;
    • linux中经常使用来达到相同接口,实现不同,如:
     1 struct platform_driver {
     2     int (*probe)(struct platform_device *);
     3     int (*remove)(struct platform_device *);
     4     void (*shutdown)(struct platform_device *);
     5     int (*suspend)(struct platform_device *, pm_message_t state);
     6     int (*resume)(struct platform_device *);
     7     struct device_driver driver;
     8     const struct platform_device_id *id_table;
     9     bool prevent_deferred_probe;
    10 };

    实现可以是freescale的imx系列芯片的串口:

     1 static struct platform_driver serial_imx_driver = {
     2     .probe        = serial_imx_probe,
     3     .remove        = __devexit_p(serial_imx_remove),
     4 
     5     .suspend    = serial_imx_suspend,
     6     .resume        = serial_imx_resume,
     7     .id_table    = imx_uart_devtype,
     8     .driver        = {
     9         .name    = "imx-uart",
    10         .owner    = THIS_MODULE,
    11         .of_match_table = imx_uart_dt_ids,
    12     },
    13 };

    下面摘自一个博客:

    转自:http://blog.sina.com.cn/s/blog_4d48cc5d0100xnh9.html

    用途:

    函数指针通常用来实现回调,也可以用来对模块调用以函数表的形式进行优化。

    使用方法:

    1、定义函数指针类型

    使用typedef更直观更方便 

    1 // 定义一个原型为int Fun( int a );的函数指针
    2 typedef int (*PTRFUN) ( int aPara );

    typedef的功能是定义新的类型。这里定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。

    2、函数指针变量的定义

    1 PTRFUN pFun; // pFun 为函数指针变量名
    2 int (*pFun2) ( int a ); // pFun2也是函数指针变量名

    3、函数指针作为函数的参数传递

     1 // 定义回调函数
     2 int CallBack( int a )
     3 {
     4     return ++a;
     5 }
     6 
     7 // 定义回调者函数
     8 void Caller( PTRFUN cb )    // void Caller( int (*cb) ( int ) ) // 也可这样申明
     9 {
    10     int nPara = 1;  
    11     int nRet = cb( nPara );
    12 }
    13 
    14 
    15 // 使用回调
    16 void main()
    17 {
    18     Caller( CallBack ); // 直接使用回调函数
    19     PTRFUN cb = CallBack; // int (*cb) ( int ); cb = CallBack;
    20     int nRet1 = cb( 99 ); // nRet1 = 100;
    21 }

    4、函数指针的指针使用

     1 // 定义函数指针的指针
     2 typedef int (**PTRPTRFUN) ( int aPara );
     3 
     4 // 函数指针的指针作为参数
     5 // void PtrCaller( PTRFUN* cb ) // 指针申明
     6 // void PtrCaller( int (**cb) ( int ) ) // 原型申明
     7 void PtrCaller( PTRPTRFUN cb )
     8 {
     9     int nRet = (*cb)(999); // nRet = 1000;
    10 }
    11 
    12 // 使用函数指针的指针
    13 void main()
    14 {
    15     PTRFUN cb = CallBack;
    16     PtrCaller( &cb );
    17 }

    5、函数指针数组的使用

    1 // 函数指针数组的定义
    2 PTRFUN fArray[10]
    3 // int (*fArray[10]) ( int ); // 原型定义
    4 for ( int i = 0; i < 10; i++ )
    5 {
    6     fArray[i] = CallBack;
    7     int nRet = fArray[i](i); // nRet = i+1;
    8 }

    6、函数指针的大小

    既然叫指针,所以跟普通的指针一样在32位系统下大小都为4

    1 int nSz1 = sizeof(PTRFUN); // nSz1 = 4;
    2 int nSz2 = sizeof(PTRPTRFUN); // nSz2 = 4;

    使用实例:

    这里给出一个使用函数指针的简单例子:

     1 //------------------------------------------------------
     2 #include <stdio.h>
     3 
     4 typedef int (*PTRFUN) ( int aPara , int bPara);
     5 
     6 int func1(int Pa, int Pb);
     7 int func2(int Pa, int Pb);
     8 int func3(int Pa, int Pb);
     9 int func4(int Pa, int Pb);
    10 
    11 void main()
    12 {
    13     int i = 0;
    14     int j = 0;
    15     PTRFUN pFuncArray[4] = {func1, func2, func3, func4};
    16     PTRFUN pFunc; 
    17 
    18     for(i = 3; i >= 0; i --)
    19     {
    20         pFunc = pFuncArray[i];
    21         printf("Output is: %d 
    ", (*pFunc)(i,i));
    22     }
    23 }
    24 
    25 int func1(int Pa, int Pb)
    26 {
    27     printf("func1 with input para %d, %d 
    ", Pa, Pb);
    28     return Pa + Pb;
    29 }
    30 
    31 int func2(int Pa, int Pb)
    32 {
    33     printf("func2 with input para %d, %d 
    ", Pa, Pb);
    34     return Pa - Pb;
    35 }
    36 
    37 int func3(int Pa, int Pb)
    38 {
    39     printf("func3 with input para %d, %d 
    ", Pa, Pb);
    40     return Pa * Pb;
    41 }
    42 
    43 int func4(int Pa, int Pb)
    44 {
    45     printf("func4 with input para %d, %d 
    ", Pa, Pb);
    46     return (Pb == 0)? 0xffff : (Pa / Pb);
    47 }

    输出为:

     1 func4 with input para 3, 3
     2 Output is: 1
     3 
     4 func3 with input para 2, 2
     5 Output is: 4
     6 
     7 func2 with input para 1, 1
     8 Output is: 0
     9 
    10 func1 with input para 0, 0
    11 Output is: 0
  • 相关阅读:
    第一章、web应用安全概论--web应用系统介绍--TCP/IP协议
    IIS配置导入导出
    shell习题第10题:打印每个单词的字数
    腾讯云的对象存储COS
    shell习题第9题:sed的常用用法
    shell习题第8题:监控nginx的502状态
    shell习题第7题:备份数据库
    shell习题第6题:监听80端口
    Python的math模块
    Python模块
  • 原文地址:https://www.cnblogs.com/aaronLinux/p/5769112.html
Copyright © 2011-2022 走看看