函数指针

  • Post author:
  • Post category:其他



转自:

函数指针


什么是函数指针?

函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。

一个具体函数的名字,如果后面不跟调用符号(即括号),则该名字就是该函数的指针(注意:大部分情况下,可以这么认为,但这种说法并不很严格)。


函数指针的声明方法


//


定义函数指针


pf


int

(*pf)(

const


int

&,

const


int

&); (1)

上面的pf就是一个函数指针,指向所有返回类型为int,并带有两个const int&参数的函数。注意*pf两边的括号是必须的,否则上面的定义就变成了:


int

*pf(

const


int

&,

const


int

&); (2)

而这声明了一个函数pf,其返回类型为int *, 带有两个const int&参数。


用typedef定义函数指针类型


//


定义函数指针类型


cmpFun


typedef


int

(*cmpFun)(

const


int

&,

const


int

&); (3)

这样,cmpFun就成了一种数据类型,可以用它来声明和定义形如(1)式中的pf那样的函数指针,比如:

cmpFun pf = 0;

cmpFun pf = someFunction;

举个例子来说明一下:


  1. #include <iostream>

  2. #include <string>

  3. using


    namespace

    std;

  4. // 定义函数指针pf

  5. int

    (*pf)(

    const


    int

    &,

    const


    int

    &);

  6. // 定义函数指针类型cmpFun

  7. typedef


    int

    (*cmpFun)(

    const


    int

    &,

    const


    int

    &);

  8. // 具体函数

  9. int

    intCompare(

    const


    int

    & aInt,

    const


    int

    & bInt)
  10. {

  11. if

    (aInt == bInt)

    return

    0;

  12. if

    (aInt > bInt)
  13. {

  14. return

    1;
  15. }

  16. else
  17. {

  18. return

    -1;
  19. }
  20. }

  21. int

    main(

    void

    )
  22. {

  23. int

    aInt = 1;

  24. int

    bInt = 2;
  25. pf = intCompare;

  26. // pf = &stringCompare;              // 和上面一句是完全一样的

  27. // 使用pf

  28. if

    (pf(aInt, bInt) == 0)
  29. {
  30. cout <<

    “two integers are equal”

    <<

    “.”

    << endl;
  31. }

  32. else


    if

    (pf(aInt, bInt) > 0)
  33. {
  34. cout << aInt <<

    ” is greater than ”

    << bInt <<

    “.”

    << endl;
  35. }

  36. else
  37. {
  38. cout << aInt <<

    ” is less than ”

    << bInt <<

    “.”

    << endl;
  39. }
  40. cout <<

    “————————”

    << endl;

  41. // 用函数指针类型cmpFun声明并初始化一个函数指针pf2
  42. cmpFun pf2 = intCompare;

  43. // 使用pf2

  44. if

    (pf2(aInt, bInt) == 0)
  45. {
  46. cout <<

    “two integers are equal”

    <<

    “.”

    << endl;
  47. }

  48. else


    if

    (pf(aInt, bInt) > 0)
  49. {
  50. cout << aInt <<

    ” is greater than ”

    << bInt <<

    “.”

    << endl;
  51. }

  52. else
  53. {
  54. cout << aInt <<

    ” is less than ”

    << bInt <<

    “.”

    << endl;
  55. }

  56. return

    0;
  57. }


函数指针作为参数

函数指针可以作为一个函数的参数,如下两种办法可以做到这一点:

(a)

int

plusFun(

int

&,

int

&,


int

(

const


int

&,

const


int

&)

);

(b)

int

plusFun(

int

&,


int

(*)(

const


int

&,

const


int

&)

);

以上两个方式做到的是类似的事情:(a)中的plusFun函数的第三个参数就是一个函数指针, (b)中的第二个参数也是一个函数指针。下面我们分别定义前面声明的两个plusFun函数。

(a)中的plusFun定义如下:


  1. //函数指针作为参数:错误的做法

  2. //int plusFun(int& aInt, int& bInt, int paf(const int& cInt, const int& dInt))

  3. //{


  4. //

  5. //       return aInt + bInt + paf(cInt, dInt);

  6. //}

  7. //函数指针作为参数:正确的做法

  8. int

    plusFun(

    int

    & aInt,

    int

    & bInt,

    int

    paf(

    const


    int

    &,

    const


    int

    &))
  9. {

  10. int

    cInt = 2;

  11. int

    dInt = 1;

  12. return

    aInt + bInt + paf(cInt, dInt);
  13. }
  14. 调用plusFun的代码:
  15. pf = intCompare;

  16. // 函数指针作为参数

  17. int

    aaInt = 3;

  18. int

    bbInt = 4;
  19. cout << plusFun(aaInt, bbInt, pf) << endl;
  20. (b)中的plusFun定义如下:

  21. //函数指针作为参数:错误的做法

  22. //int plusFun(int& aInt, int(*paf2)(const int& bInt, const int& cInt))

  23. //{


  24. //       return aInt + paf2(bInt, cInt);

  25. //}

  26. //函数指针作为参数:正确的做法

  27. int

    plusFun(

    int

    & aInt,

    int

    (*paf2)(

    const


    int

    &,

    const


    int

    &))
  28. {

  29. int

    bInt = 1;

  30. int

    cInt = 2;

  31. return

    aInt + paf2(bInt, cInt);
  32. }
  33. 调用plusFun的代码:
  34. cmpFun pf2 = intCompare;

  35. // 函数指针作为参数

  36. int

    aaInt = 3;
  37. cout << plusFun(aaInt, pf2) << endl;


函数指针作为返回值

一个函数的返回值可以是一个函数指针,这个声明形式写起来有点麻烦:


//


函数指针作为返回值


int

(*retFunPointer(

int

))(

const


int

&,

const


int

&);

上面的声明的含义:

a) retFunPointer是一个函数,该函数有一个int类型的参数;

b) retFunPointer返回值是一个函数指针,它指向的是带有两个const int&类型参数,且返回类型为int的函数。

retFunPointer的定义:


//


函数指针为返回值


int

(*retFunPointer(

int

aInt))(

const


int

&,

const


int

&)

{

cout << aInt << endl;


// pf


已经在前面定义过了


return

pf;

}

调用代码示例:


//


函数指针作为返回值,


retFunPointer


返回一个


cmpFun


类型的函数指针

cmpFun pf3 = retFunPointer(aaInt);


int

result = pf3(aaInt, bbInt);

cout << result << endl;