函数指针的几种用法

转载 2012年03月28日 23:33:45

什么是函数指针?

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

 

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

 

函数指针的声明方法

// 定义函数指针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;

 

举个例子来说明一下:

#include <iostream>

#include <string>

using namespace std;

 

// 定义函数指针pf

int (*pf)(const int&, const int&);

 

// 定义函数指针类型cmpFun

typedef int (*cmpFun)(const int&, const int&);

 

// 具体函数

int intCompare(const int& aInt, const int& bInt)

{

         if(aInt == bInt) return 0;

         if(aInt > bInt)

         {

                   return 1;

         }

         else

         {

                   return -1;

         }

}

 

int main(void)

{

         int aInt = 1;

         int bInt = 2;

 

         pf = intCompare;

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

 

         // 使用pf

         if(pf(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" << "." << endl;

         }

         else if(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt << "." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt << "." << endl;

         }

 

         cout << "------------------------" << endl;

         // 用函数指针类型cmpFun声明并初始化一个函数指针pf2

         cmpFun pf2 = intCompare;

         // 使用pf2

         if(pf2(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" << "." << endl;

         }

         else if(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt << "." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt << "." << endl;

         }

 

         return 0;

}

 

 

函数指针作为参数

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

(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定义如下:

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

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

//{

//

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

//}

 

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

int plusFun(int& aInt, int& bInt, int paf(const int &, const int &))

{

         int cInt = 2;

         int dInt = 1;

         return aInt + bInt + paf(cInt, dInt);

}

 

调用plusFun的代码:

pf = intCompare;

// 函数指针作为参数

int aaInt = 3;

int bbInt = 4;

cout << plusFun(aaInt, bbInt, pf) << endl;

 

(b)中的plusFun定义如下:

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

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

//{

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

//}

 

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

int plusFun(int& aInt, int(*paf2)(const int&, const int&))

{

         int bInt = 1;

         int cInt = 2;

         return aInt + paf2(bInt, cInt);

}

 

调用plusFun的代码:

cmpFun pf2 = intCompare;

// 函数指针作为参数

int aaInt = 3;

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;

 

 

包含上面所有情况的完整代码

#include <iostream>

#include <string>

using namespace std;

 

// 定义函数指针pf

int (*pf)(const int&, const int&);

 

// 定义函数指针类型cmpFun

typedef int (*cmpFun)(const int&, const int&);

 

// 函数指针作为参数

int plusFun(int&, int(const int&, const int&));

int plusFun(int&, int(*)(const int&, const int&));

 

// 函数指针作为返回值

int (*retFunPointer(int))(const int&, const int&);

 

// 具体函数

int intCompare(const int& aInt, const int& bInt)

{

         if(aInt == bInt) return 0;

         if(aInt > bInt)

         {

                   return 1;

         }

         else

         {

                   return -1;

         }

}

 

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

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

//{

//

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

//}

 

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

int plusFun(int& aInt, int& bInt, int paf(const int &, const int &))

{

         int cInt = 2;

         int dInt = 1;

         return aInt + bInt + paf(cInt, dInt);

}

 

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

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

//{

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

//}

 

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

int plusFun(int& aInt, int(*paf2)(const int&, const int&))

{

         int bInt = 1;

         int cInt = 2;

         return aInt + paf2(bInt, cInt);

}

 

// 函数指针为返回值

int (*retFunPointer(int aInt))(const int&, const int&)

{

         cout << aInt << endl;

         // pf已经在前面定义过了

         return pf;

}

 

int main(void)

{

         int aInt = 1;

         int bInt = 2;

 

         pf = intCompare;

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

 

         // 使用pf

         if(pf(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" << "." << endl;

         }

         else if(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt << "." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt << "." << endl;

         }

 

         cout << "------------------------" << endl;

         // 用函数指针类型cmpFun声明并初始化一个函数指针pf2

         cmpFun pf2 = intCompare;

         // 使用pf2

         if(pf2(aInt, bInt) == 0)

         {

                   cout << "two integers are equal" << "." << endl;

         }

         else if(pf(aInt, bInt) > 0)

         {

                   cout << aInt << " is greater than " << bInt << "." << endl;

         }

         else

         {

                   cout << aInt << " is less than " << bInt << "." << endl;

         }

 

         cout << "------------------------" << endl;

         // 函数指针作为参数

         int aaInt = 3;

         int bbInt = 4;

         cout << plusFun(aaInt, bbInt, pf) << endl;

         cout << plusFun(aaInt, pf2) << endl;

 

         cout << "------------------------" << endl;

         // 函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针

         cmpFun pf3 = retFunPointer(aaInt);

         int result = pf3(aaInt, bbInt);

         cout << result << endl;

 

         return 0;

}

函数指针的几种用法

函数指针的几种用法   什么是函数指针? 函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。   一个具体函数的名字,...
  • u011761327
  • u011761327
  • 2013年08月20日 21:14
  • 141

C/C++函数指针用法总结

C++函数指针 一函数指针介绍   函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下: int add(int nLeft,int nRight);//...
  • u013507368
  • u013507368
  • 2014年12月02日 16:48
  • 710

C语言—理解函数指针以及它的用法

什么是函数指针? 指针前面已经写过好多,自以为认识的差不多了,但是今天突然看到一个问题,写一个函数指 针,函数指针就是一个指向函数首地址的指针,接下来写几个指针: 写一个函数指针 写一个函...
  • Dawn_sf
  • Dawn_sf
  • 2017年02月13日 16:59
  • 4717

C++中仿函数/函数对象,函数指针的用法

研究这个起因是这样的,就是今天在用priority_queue的时候,需要自定义比较函数,但是此时又不能修改需要比较的类的内容(即不能用重载...
  • haolexiao
  • haolexiao
  • 2016年12月06日 21:44
  • 689

小记C++函数指针的用法

今天跟Qt小盆友过六一儿童节时,发现她身上有句代码是这么写的:        学过Qt的应该知道这句代码的作用。没学过的也没关系,这个函数要求传入的参数是这样的: QObject:...
  • lgcacddn
  • lgcacddn
  • 2014年06月01日 19:10
  • 986

python函数函数指针用法

函数指针,主要用于向函数中传递一个函数名用该函数名(即函数指针)可以进行动态策略执行。 下面是一个python版本的函数指针用法 def minus(a, b): return a - ...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2015年10月21日 09:49
  • 4472

成员变量/函数指针的用法

标准C++并没有真正的面向对象的函数指针。这是很遗憾的,因为面向对象的函数指针(有时也称为委 托)已经在其他语言中被证明了它的价值。在Delphi(面向对象的Pascal语言)中,面向对象的函数指针是...
  • zyobi
  • zyobi
  • 2006年09月06日 22:13
  • 1556

关于Handler的几种用法

当你创建一个thread,并且想在里面处理消息时: 方案一 protected void onCreate(Bundle savedInstanceState) {       ...
  • ffmpeg4976
  • ffmpeg4976
  • 2015年07月19日 08:53
  • 271

C语言函数指针的几种用法

程序如下: #include
  • qq_36501535
  • qq_36501535
  • 2016年10月29日 22:33
  • 64

“指针函数”与“函数指针” typedef 定义函数指针

一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型...
  • lishenglong666
  • lishenglong666
  • 2011年12月19日 14:41
  • 1187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数指针的几种用法
举报原因:
原因补充:

(最多只允许输入30个字)