这一篇博文和标题一样,用于介绍指向函数的指针。那么,可能就有很多人要发问了,为什么要介绍指向函数的指针呢?指向函数的指针有什么用呢?
其实,这些问题都可以用一个名词来解释,那就是指向函数的指针的功能——消费未来
那么,就有人可能理解了我这个名词的意义,没有理解的同志也不要心急,且听本人细细分析:
首先,我来给大家一个情景,如果你已经是一个程序员了,你要做一套“工具”程序,但在制作的时候,为了你的“工具”程序能够被更多层面的人用到,你的“工具”程序就需要在不知道有些条件的情况下还能适应许多种情况,但是在有些条件是未知的话,就很难办了,这就需要我们用到这篇博文所讲解的知识——函数指针
这里我来介绍一下函数指针的使用方法:
1.定义:
TYPE (*pf)(TYPE1, TYPE2);
这里来做一定的解释:
pf可指向TYPE (TYPE1, TYPE2)类型的函数。pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为TYPE,说明pf指向的函数返回值为TYPE1,TYPE2(参数的个数是不受限制的,这里仅以两个参数为例)。
或者这样定义:
typedef TYPE (*pf)(TYPE1, TYPE2);
这两种定义意义上是一样的,所以,我们在使用时,要根据需要采取最佳编写方法。
2.普通使用:
void fun(int lvaule); // 声明函数
void (*pfun)(int) = fun; // 声明指向函数的指针, 该函数接受一个int参数, 返回void, 并用print函数的地址初始化
这里的void (pfun)(int) = fun 也可以写作 void (pfun)(int) 或是void (*pfun)(int a),这本质上是定义了一个指针,它指向一个返回值是void类型,参数只有一个int类型的函数.
下面,来通过一个例子来将指向函数的指针基本用法:
比如我们现在要来实现对两个整型数值的加减乘除的操作,那么,我们运用这篇博文所讲解的方法,就可以用以下代码实现:
int add(int num1, int num2);
int sub(int num1, int num2);
int mul(int num1, int num2);
int mul(int num1, int num2) {
return num1 * num2;
}
int sub(int num1, int num2) {
return num1 - num2;
}
int add(int num1, int num2) {
return num1 + num2;
}
void doSomething(int, int, int (*fun)(int, int));
上面代码中doSomething()函数中的int (*fun)(int, int)参数就是我们上面所讲的指向函数的指针,那么我们来分析一下:
返回值为 int ,表示我们用这个指针表示的那一类函数的返回值是int型
参数为 两个 int型,表示我们所表示的那一类函数的参数是两个int型的参数
而我们在上面所编写的add()、sub()和mul()函数就是我们这个函数指针所表示的那类函数
我们现在用展示下完整的代码:
#include <stdio.h>
int add(int num1, int num2);
int sub(int num1, int num2);
int mul(int num1, int num2);
int mul(int num1, int num2) {
return num1 * num2;
}
int sub(int num1, int num2) {
return num1 - num2;
}
int add(int num1, int num2) {
return num1 + num2;
}
void doSomething(int, int, int (*fun)(int, int));
void doSomething(int one, int other, int (*fun)(int, int)) {
printf("%d
", fun(one, other));
}
int main(void) {
int one = 3;
int other = 13;
int result;
int (*fun)(int, int);
fun = add;
result = fun(one, other);
printf("%d
", result);
fun = sub;
result = fun(one, other);
printf("%d
", result);
doSomething(one, 14, add);
doSomething(14, one, sub);
doSomething(14, one, mul);
return 0;
}
看到以上代码的运行结果我们也会发现加减乘操作并没有出现错误。
那么,我再提醒大家一点:指向函数的指针所表示的不是一个函数,而是一类函数,返回值就是除去这个指针的*以外的返回值,参数就是这个指针括号内的参数。
至于函数的功能就由使用这个指针的使用者决定了。
至于更加精彩的使用,将在本人之后的数据结构与算法分类的博文中使用,若对此算法有兴趣的同学请持续关注本人的博文。