指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)

一、指针函数

1、解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数。如:

 int fun(int x,int y);    //这是一个普通函数的声明,返回值是一个int类型,是一个数值。

 int *fun(in x,int y);  //这就是指针函数,返回值是一个int类型的指针,是一个地址。

2、指针函数的写法:

 int *fun(in x,int y);

   或int * fun(in x,int y);

   或int* fun(in x,int y); 

二、函数指针

1、解释:指向数据区域的指针,称为数据指针。指向代码区域的指针称为指向函数的指针,简称函数指针

  函数指针,其本质是一个指针变量,只不过该指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如:

  //比较两个string对象的长度

  bool lengthCompare(const string &, const string &);

  该函数的类型是bool (const string &, const string &)。要想声明一个可以指向该函数的指针,只需要指针替换函数名即可:

  bool (*pf) (const string &, const string &);    //该指针还未初始化

  这句语句的意思是,pf就是一个指向函数的指针,其中该函数的参数是两个const string的引用,返回值是bool类型。

  注意:*pf两边的括号必不可少。如果不写这个括号,则pf就是一个返回值为bool指针的函数了,大家可以对比上面的指针函数。

2、函数指针的定义方法:

 int (*p)(int , int );   //未初始化

 或:int (*p)(int , int ) = q ;   //在定义函数指针时初始化,其中q应该与指针p所指向的函数类型相同。

 或:int q(int);

   int (*p)(int);

   p=q;

3、使用函数指针

  当我们把函数名作为一个值使用时,该函数自动地转换成指针。例如:按照如下形式我们可以将lengthCompare的地址赋给pf:

  pf = lengthCompare;    //pf指向名为lengthCompare的函数

  pf = &lengthCompare;    //同上面等价的赋值语句

  此外,我们还可以直接使用函数指针调用该函数(下面三行是等价的):

  bool b1 = pf("Hello", "Goodbye");

  bool b2 = (*pf)("Hello", "Goodbye");

  bool b3 = lengthCompare("Hello", "Goodbye");

注:函数指针本身也是一种数据类型,如:

    int (*) (int);

  是int (int)型函数的指针类型,其中的“(*)”的括号也是不能省略的。

  函数指针的定义形式看起来比较复杂,所以通常采用typedef来简化。例如:

  typedef int  (*Fun) (int a , int b);  

  表示声明了一个函数指针类型。注意,此处不是定义函数指针实体。因此:

  int m(int , int);

  Fun funp = m;    //ok

  Fun = m;    //错

  

  

  

猜你喜欢

转载自www.cnblogs.com/SupremeBoy/p/10269009.html