指向函数的指针——消费未来

这一篇博文和标题一样,用于介绍指向函数的指针。那么,可能就有很多人要发问了,为什么要介绍指向函数的指针呢?指向函数的指针有什么用呢?
其实,这些问题都可以用一个名词来解释,那就是指向函数的指针的功能——消费未来

那么,就有人可能理解了我这个名词的意义,没有理解的同志也不要心急,且听本人细细分析:
首先,我来给大家一个情景,如果你已经是一个程序员了,你要做一套“工具”程序,但在制作的时候,为了你的“工具”程序能够被更多层面的人用到,你的“工具”程序就需要在不知道有些条件的情况下还能适应许多种情况,但是在有些条件是未知的话,就很难办了,这就需要我们用到这篇博文所讲解的知识——函数指针

这里我来介绍一下函数指针的使用方法:
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\n", 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\n", result);

	fun = sub;
	result = fun(one, other);
	printf("%d\n", result);

	doSomething(one, 14, add);
	doSomething(14, one, sub);
	doSomething(14, one, mul);

	return 0;
}

在这里插入图片描述
看到以上代码的运行结果我们也会发现加减乘操作并没有出现错误。

那么,我再提醒大家一点:指向函数的指针所表示的不是一个函数,而是一类函数,返回值就是除去这个指针的*以外的返回值,参数就是这个指针括号内的参数。
至于函数的功能就由使用这个指针的使用者决定了。

至于更加精彩的使用,将在本人之后的数据结构与算法分类的博文中使用,若对此算法有兴趣的同学请持续关注本人的博文。

posted @ 2020-03-04 18:01  在下右转,有何贵干  阅读(199)  评论(0编辑  收藏  举报