函数指针

开发工具与关键技术: Visual Studio / C++
作者:何文涛
撰写时间:2019-5-2

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。

顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。
函数指针有两个用途:调用函数和做函数的参数。
c++函数指针的定义形式:返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….);

指向函数的指针变量简称为函数指针
函数的类型是函数的接口
可以通过指针变量的间址方式调用函数

函数指针声明:
和普通函数原型声明差不多
Int add(int a,int b)这个是普通函数原型声明。

而函数指针声明
要想声明一个指向该类函数的指针,只需用指针替换函数名即可:
Int (p)(int a)
这里声明了一个函数指针,
p指向的是int 类型a的地址,
而不能写成int
p(int)
这样的话就成了声明一个p(int)的函数,返回类型为int

函数指针是指向函数的指针变量。所以函数指针其实是指针变量,只不过该指针
变量指向函数。

下面就举了个例子来说明函数指针
如下面图所示:

函数指针

首先定义了两个函数,fun1和fun2 并且写了语句
第一个函数:
定义了一个类型为int的函数不带参数,输出字符fun1,并且
给了返回值,返回值为1。

第二个函数:
定义了一个函数fun2,并且带了两个参数,分别为 int类型的
K和char类型的c,输出字符fun2和接收的k和c的值。

函数指针

然后来到主函数这边:
首先定义了一个int类型的函数指针p并指向了空。
然后在定义了一个指针函数p2,并且还带了两个参数,int还有char
指针指向为空。
定义int类型的变量a和b。
就到了赋值,p赋值了函数方法fun1,因为函数返回的是1说以输出结果
也是1,。
然后a就调用了p(),所以现在a等于1。
就输出a的结果
到了第二种调用方法调用了函数指针。
输出了b。
赋值了p2赋值了函数指针,这里用了取址符&,由于p2是个
指针&是说明了这个指针指向的内存有什么。
最后给了p2两个值,分别是数字1和子母a

下面是输出结果;
如图所示,

函数指针

结果1,2;
函数里输出的结果,分别是字符的fun1还有返回的数字1
结果3,4;
由于写了两种方法来调用说以就出现了两个一样的结果。
如图所示

函数指针
函数指针

结果5;
调用的是方法fun2,下面给p2分别赋值两个值,分别是数字2
和字符a
结果6
同样写了两个赋值方法了所以出现了两个结果,这个结果调用了
函数fun2,并赋的值是数字2和字符b。
以上就是全部输出结果

注意:函数指针所指向的函数一定要保持函数的返回值类型,函数参数个数,类型一致。
普通函数指针实际上保存的是函数体的开始地址,因此也称"代码指针",以区别于 C/C++ 最常用的数据指针。