当前位置: 首页 > news >正文

C语言中的回调函数 和 函数指针

以冒泡排序为例:

void sort(int *a, int size)
{
    int i, j;
    for (i = 0; i < size-1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (a[j] > a[j+1])
            {
                int num = a[j];
                a[j] = a[j+1];
                a[j+1] = num;
            }
            
        }
        
    }
    
}

int main(){

    int arr[9] = {1,2,3,4,5,6,7,8,9};

    sort(arr, 9); // sort
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

结果

在这里插入图片描述
但冒泡排序只能实现从小到大排序,如果想实现从大到小排序,难道就要重写sort函数了吗

可以用函数指针 作为回调函数传入,避免修改函数的麻烦
定义以下函数

int greater(int a, int b)
{
    return a < b ? 1 : 0;
}

int less(int a, int b)
{
    return a > b ? 1 : 0;
}

void sort2(int *a, int size, int (*p)(int,int))
{
    int i, j;
    for (i = 0; i < size-1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (p(a[j], a[j+1]))
            {
                int num = a[j];
                a[j] = a[j+1];
                a[j+1] = num;
            }
            
        }
        
    }
    
}

sort2中添加了函数指针 int (*p)(int,int), 且函数比较由

a[j] > a[j+1]

变为了

(p(a[j], a[j+1])

此时,main函数为

int main(){

    int arr[9] = {1,2,3,4,5,6,7,8,9};

    //sort(arr, 9); // sort
    sort2(arr, 9, greater);
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\r\n");

    sort2(arr, 9, less);

    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

结果:
在这里插入图片描述
没有修改sort函数 就实现了冒泡排序的逆序

一个看复杂指针的技巧:

例如

int *(*(*fp)(int))[10];

右左法则
先向右分析 再向左分析

找到变量名fp 向右看 是个右括号,向左看,是个*号,说明fp是个指针。再分析fp指向什么。

c 语言中,括号除了表示优先级,还可以作位函数调用运算符。所以fp是个指针,指向函数。函数需要分析参数和返回值类型。
fp右侧是个函数,函数的参数只有一个,类型为int。

(int)

再向左看 函数的返回值是

(*

是个指针

这个指针指向什么? 继续先向右看 指向了一个数组

[10]

再看左边 剩下了 int*
表示数组中每个元素都是整型指针

相关文章:

  • 【Kotlin】集合操作 ④ ( Set 集合 | 可变 Set 集合 | List 与 Set 之间相互转换 | 数组类型 )
  • mysql 中字段的 collate 和 charset 有什么区别
  • IBM WebSphere Message Queue MQ修改最大通道数
  • 【第十六篇】Camunda系列-动态表单
  • 【电子学会】2022年12月图形化四级 -- 简易抗疫物资管理系统
  • 5555555
  • 二十三、备忘录模式 ( Memento Pattern )
  • Spring AOP【统一异常处理与统一数据格式封装】
  • 数据库自愈
  • 计算机 - - - 局域网共享文件夹,局域网传输文件(待完善)
  • 微分方程的特征值解法:斯图姆-刘维尔方程
  • Allegro如何快速打开和关闭层面操作指导
  • 【科研试剂】16-Heptadecynoic acid,93813-16-2,16-庚二酸
  • 尚硅谷谷粒音乐项目学习笔记及答疑解惑(1-20集)
  • 基于springboot,vue影院订票系统
  • 【1814. 统计一个数组中好对子的数目】
  • 第18章_JDBC
  • 未雨绸缪·鸟巢设计与软件架构的共性思考
  • MySQL基础命令表及补充说明
  • 吴恩达机器学习课程笔记:模型描述、假设函数、代价函数