zoukankan      html  css  js  c++  java
  • 指向函数的指针——消费未来

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

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

    这里我来介绍一下函数指针的使用方法:
    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;
    }
    

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

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

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

  • 相关阅读:
    hive数据倾斜处理
    hbase基本命令
    hdfs基本操作命令
    hive常用函数
    sql面试题
    tcpdump 的正确食用方法
    kotlin 学习感受
    搭建docker hadoop环境
    安全模型分析核心
    personal evolution
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12411039.html
Copyright © 2011-2022 走看看