回调函数(Language C)

#源于指针的深入学习

对于回调函数,其实我们只需要了解一下函数指针即可使用回调函数了

什么是回调函数?

通俗的来讲,它是一个函数指针变量(注意:它不是指针函数,它们是不同的一个概念)

函数指针---指针存储着一个函数的地址

指针函数---该函数的返回值是指针类型

为何要使用函数指针?

其实在企业级项目开发中,开发为了避免代码壅余,以及封装细节,多重调用,日常维护中减轻运维的所需要的时间金钱成本;从而大量的使用回调函数作为别的函数的参数---怎么创建出这个神奇的回调函数呢?也就是我们说的函数指针。

怎么创建函数指针&如何使用?

首先,我们需要知道,指针存储地址时,往往获取变量的首地址。那么该如何获得函数的首地址呢

  1. 函数名---其实就是地址
  2. 函数名就是该函数所占内存的首地址

那么我们就可以直接把函数地址以函数名的方式存储在指针中

写法:

函数返回类型(*变量名)(参数类型与个数) = 我们想要的那个函数的函数名

例如:

1.无返回类型且无参数的函数指针创建.

void printstr(){
    printf("Hello,World");
}

void (*p)() = printstr;

/*分析:在此处,我定义的函数printstr并无返回值
所以函数指针的创建时,它也是void; 并且该函数并未
有接收的参数;所以p变量旁边的()也是空的*/

 2.有返回值且有参数的函数指针创建.

int better(int a,int b):
    return (a > b) ? 1 : 0 
//此为三目运算 如果a > b 成立则返回 1 否则为 0


//创建函数指针
int (*c)(int,int) = better


/*注意,此处函数指针前面的返回类型 是与函数一致的
参数个数与原函数(better)一致,唯一不同的是,我们只需要
写出参数的类型,无需具体的参数名

又如这个:

#include <stdio.h>
void f1() {
	printf("hello,world");
}

int main() {

	void (*p)(); //定义函数指针 
	 p = f1; //函数名就是首地址--->传地址了
	 p(); //通过函数指针调用函数 等价于 f1()
	int (*a)(int, int) = add;//告诉有几个形参,类型
	printf("%d\n", a(1, 2));
	return 0;
}

那么,我们进阶的来体验一下什么是回调函数

#include <stdio.h>

int less(int x,int y){
    return ( x < y ) ? 1 : 0;
}

int greater(int x, int y) {
    return ( x > y ) ? 1 : 0;
}

//回调函数:把函数名作为另一个函数的参数
//作用修改:修改函数的功能

void sort(int *a,int len,int (*p)(int,int)) {
    int i,j;
    for (i = 0; i < len - 1; i++) {
        for ( j = 0; j < len - i - 1; j++) {
        //if (a[j] > a[j+1]) { 原先的判别
            if (p(a[j],a[j+1])) { 
    //通过函数指针调用函数
                int num = a[j];
                a[j] = a[j+1];
                a[j + 1] = num;
            }
        }
      }
    }


int main() {
    int a[10] = {0}; //创建整数数组
/*其实在使用中,指针与数组是相同的,所以我们在参数设置的为指针
传入的时候可以用 数组名 
    
    int i;
    for ( i = 0; i < 10; i++) {
        scanf("%d",a[i]);
    }

    sort(a,10,greater); //只需要修改这里传入的函数
    for ( i = 0; i < 10; i++) {
        printf("%d",a[i]);
    }
//打印出排序后的数组
    printf("\n");
    return 0;
}



请观看的时候,一个个的实现一下,会对我们的理解更有帮助

相关推荐

  1. 函数详解

    2024-02-23 17:18:02       63 阅读
  2. ajax函数

    2024-02-23 17:18:02       29 阅读
  3. 函数(Language C)

    2024-02-23 17:18:02       50 阅读
  4. 函数的介绍

    2024-02-23 17:18:02       38 阅读
  5. C++ 函数指针与函数

    2024-02-23 17:18:02       47 阅读
  6. C 函数指针与函数

    2024-02-23 17:18:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-23 17:18:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-23 17:18:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-23 17:18:02       82 阅读
  4. Python语言-面向对象

    2024-02-23 17:18:02       91 阅读

热门阅读

  1. Less基本语法

    2024-02-23 17:18:02       48 阅读
  2. python 几种常见的音频数据读取、保存方式

    2024-02-23 17:18:02       51 阅读
  3. 解释 Git 的基本概念和使用方式

    2024-02-23 17:18:02       45 阅读
  4. 【Qt】实现 Ctrl + 鼠标滚轮 缩放文本功能

    2024-02-23 17:18:02       54 阅读
  5. vue实现列表自动滚动效果

    2024-02-23 17:18:02       59 阅读
  6. flink-cdc使用小结

    2024-02-23 17:18:02       52 阅读