zoukankan      html  css  js  c++  java
  • 函数指针

    顾名思义,指针函数即返回指针的函数。其一般定义形式如下:

          类型名 *函数名(函数参数表列);

        其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。

        “(函数参数表列)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:

        int *pfun(int, int);

        由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:

        int *(pfun(int, int));

        接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。

        我们不妨来再看一看,指针函数与函数指针有什么区别?

        int (*pfun)(int, int);

        通过括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。

        虽然它们只有一个括号的差别,但是表示的意义却截然不同。函数指针的本身是一个指针,指针指向的是一个函数。指针函数的本身是一个函数,其函数的返回值是一个指针。

    2.    用函数指针作为函数的返回值

        在上面提到的指针函数里面,有这样一类函数,它们也返回指针型数据(地址),但是这个指针不是指向int、char之类的基本类型,而是指向函数。对于初学者,别说写出这样的函数声明,就是看到这样的写法也是一头雾水。比如,下面的语句:

        int (*ff(int))(int *, int);

    我们用上面介绍的方法分析一下,ff首先与后面的“()”结合,即:

        int (*(ff(int)))(int *, int);                            // 用括号将ff(int)再括起来

    也就意味着,ff是一个函数。

        接着与前面的“*”结合,说明ff函数的返回值是一个指针。然后再与后面的“()”结合,也就是说,该指针指向的是一个函数。

    这种写法确实让人非常难懂,以至于一些初学者产生误解,认为写出别人看不懂的代码才能显示自己水平高。而事实上恰好相反,能否写出通俗易懂的代码是衡量程序员是否优秀的标准。一般来说,用typedef关键字会使该声明更简单易懂。在前面我们已经见过:

        int (*PF)(int *, int);

    也就是说,PF是一个函数指针“变量”。当使用typedef声明后,则PF就成为了一个函数指针“类型”,即:

        typedef int (*PF)(int *, int);

    这样就定义了返回值的类型。然后,再用PF作为返回值来声明函数:

        PF ff(int);

       下面将以程序清单1为例,说明用函数指针作为函数的返回值的用法。当程序接收用户输入时,如果用户输入d,则求数组的最大值,如果输入x,则求数组的最小值,如果输入p,则求数组的平均值。

    程序清单 1  求最值与平均值示例

    1       #include<stdio.h>

    2       #include <assert.h>

    3       double GetMin(double *dbData, int iSize)               // 求最小值

    4       {

    5           double dbMin;

    6           int i;

    7      

    8           assert(iSize>0);

    9           dbMin=dbData[0];

    10          for (i=1; i<iSize; i++){

    11                if (dbMin>dbData[i]) {

    12                     dbMin=dbData[i];

    13                }

    14          }

    15          return dbMin;

    16     }

    17

    18     double GetMax(double *dbData, int iSize)                 // 求最大值

    19     {

    20         double dbMax;

    21         int i;

    22

    23         assert(iSize>0);

    24         dbMax=dbData[0];

    25         for (i=1; i<iSize; i++){

    26             if (dbMax< dbData[i]) {

    27                 dbMax=dbData[i];

    28             }

    29         }

    30         return dbMax;

    31     }

    32

    33     double GetAverage(double *dbData, int iSize)            // 求平均值

    34     {

    35         double dbSum=0;

    36         int i;

    37    

    38         assert(iSize>0);

    39         for (i=0; i<iSize; i++)

    40         {

    41              dbSum+=dbData[i];

    42         }

    43         return dbSum/iSize;

    44     }

    45

    46     double UnKnown(double *dbData, int iSize)             // 未知算法

    47     {

    48         return 0;

    49     }

    50

    51     typedef double (*PF)(double *dbData, int iSize);     // 定义函数指针类型

    52     PF GetOperation(char c)                              // 根据字符得到操作类型,返回函数指针

    53     {

    54         switch (c)

    55         {

    56           case 'd':

    57                     return GetMax;

    58           case 'x':

    59                     return GetMin;

    60           case 'p':

    61                     return GetAverage;

    62           default:

    63                     return UnKnown;

    64           }

    65     }

    66

    67     int main(void)

    68     {

    69          double dbData[]={3.1415926, 1.4142, -0.5,999, -313, 365};

    70          int iSize=sizeof(dbData)/sizeof(dbData[0]);

    71          char c;

    72

    73          printf("Please input the Operation :\n");

    74          c=getchar();

    75          printf("result is %lf\n", GetOperation(c)(dbData,iSize));   // 通过函数指针调用函数

    76    }

        上述程序中前面4个函数分别实现求最大值、最小值、平均值和未知算法,然后实现了GetOperation函数。这个函数根据字符的返回值实现上面4个函数。它是以函数指针的形式返回的,从后面的main函数的GetOperation(c)(dbData, iSize)可以看出,通过这个指针可以调用函数。

  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/nktblog/p/2918084.html
Copyright © 2011-2022 走看看