每个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。ios
注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址。函数
返回类型 (*函数名) (参数表);spa
例:指针
#include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数的函数 char (*pFun)(int); //定义一个返回类型为char,参数为int的函数 //从指针层面上理解该函数,即函数的函数名其实是一个指针, //该指针指向函数在内存中的首地址 char glFun(int a) { cout << a; //return a; } int main() { //将函数glFun的地址赋值给变量pFun pFun = glFun; //*pFun”显然是取pFun所指向地址的内容, 固然也就是取出了函数glFun()的内容,而后给定参数为2。 (*pFun)(2); //pfun(2); 也是对的 return 0; }
typedef 返回类型 (*函数名) (参数表);code
例:内存
#include <iostream> using namespace std; //定义一个函数指针类型 typedef char (*mypFun)(int); //定义一个返回类型为char,参数为int的函数 //从指针层面上理解该函数,即函数的函数名其实是一个指针, //该指针指向函数在内存中的首地址 char glFun(int a) { cout << a; //return a; } int main() { //定义一个函数指针变量,将函数glFun的地址赋值给变量myp mypFun myp = glFun; //*pFun”显然是取pFun所指向地址的内容, //固然也就是取出了函数glFun()的内容,而后给定参数为2。 (*myp)(2); //myp(2); 也是对的 return 0; }
(*myp)(2); //下文用 星myp表示 myp(2); //两种写法都是对的
真是很是棒的语法! 为什么 myp 和 ( 星 myp)等价呢?一种学派认为,因为 myp 是函数指针,而 ( 星 myp)是函数,所以应将 ( 星 myp)() 用做函数调用。另外一种学派认为,因为函数名是指向该函数的指针,指向函数的指针的行为应与函数名类似,所以应将 myp() 用做函数调用使用。C++ 进行了折衷——这 2种方式都是正确的,或者至少是容许的,虽然它们在逻辑上是互相冲突的。在认为这种折衷粗糙以前,应该想到,容忍逻辑上没法自圆其说的观点正是人类思惟活动的特色。io