函数指针

来源:互联网 发布:网络教育文凭考公务员 编辑:程序博客网 时间:2024/04/28 08:14

   一、函数指针的定义

   顾名思义,函数指针指的是指向函数的指针。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,因而可以利用函数指针调用该函数。它的定义如下:

   函数类型 (*指针名字)(函数形参表)

   可以这样来理解这个定义(假设指针名字为PtrName):

   ① PtrName首先与‘*’相结合,这意味着PtrName是一个指针。

   ② PtrName与后面的括号相结合,说明该指针指向一个函数,函数形参表就是所指函数的形参表。

   ③ 前面的函数类型就是所指函数的返回类型。

   实际上,函数指针和函数名都是指针,指向同一个入口地址(代码在内存中的首地址),只是函数指针是一个指针变量,能指向不同函数,而函数名只能指向本函数(不够灵活)。

 

   二、typedef定义函数指针类型

   在实际应用中,我们希望能定义一个类型,用这个类型定义多个函数指针。这需要使用typedef关键字,即:

typedef int (*pFun)(int, int)

这样,pFun就是一个类型了,可以用来定义函数指针变量。

 

   三、应用

   (1)函数指针指向一般函数或者类的静态成员函数。例如:

   typedef int (*pFun)(int, int);

   class CTest

   {

   public:

       static int GetSum(int a, int b)

       {

           return (a + b);

       }

   };

   int GetMax(int a, int b)

   {

       return (a > b) ? a : b;

   }

 

   void main

   {

      pFun pfun;

 

      pfun = GetMax;      //pfun指向一般函数

      (*pfun)(50, 100);   //*pfun取出所指向的内容,也就是函数GetMax的内容

     

     pfun = CTest::GetSum;//pfun指向类的静态成员函数

     (*pfun)(50, 100);

   }

 

   (2)函数指针指向类的成员函数。函数指针指向类的非静态函数与静态函数,在重定义函数指针类型上是有区别的。在例如:

 

   class CTest

   {

   public:

       int GetMax(int a, int b)

       {

           return (a > b) ? a : b;

       }

       int GetMin(int a, int b)

       {

           return (a < b) ? a : b;

       }

   };

 

   typedef int (CTest::*pClassFun)(int, int); //指向类的非静态函数,这里要为函数指针指定类

 

   void main()

   {

       pClassFun pfun = &CTest::GetMax; //这里应加上取地址符号&;类的成员函数是共享的,所以

                                        //直接去类的成员函数地址

       CTest *pCTest = new CTest;

       (pCTest->*pFun)(50, 100);

       delete pCTest;

   }

 

   (3)使用函数指针作为函数返回值。typedef将函数指针重定义为一种类型,该类型能像int、char等内置类型一样被使用。

   class CTest;

   typedef (*CTest::pClassFun)(int, int);

 

   class CTest

   {

   public:

       int GetRet(char cFlag)

       {

       case 'a' :

           return &CTest::GetMax;

           break;

       case 'b' :

           return &CTest::GetMin;

           break;

       default :

           break;

       }

 

   private:

       int GetMax(int a, int b)

       {

           return (a > b) ? a : b;

       }

       int GetMin(int a, int b)

       {

           rerurn (a < b) ? a : b;

       }

   }

 

   void main()

   {

       CTest *pCTest = new CTest;

       (pCTest->*pCTes->GetRet('a'))(50, 100);

   }