C语言——详解回调函数

简介: C语言——详解回调函数

一、什么是回调函数❓❓

回调函数:通过函数指针调用的函数,就是将一个函数的指针(地址)作为参数,当函数指针调用其所指向的函数时,这就叫回调函数。

注意:回调函数不是由该函数的实现方直接调用,而是在特定条件下,由另外一方进行调用,用于对该条件的相应。

二、回调函数应用演示 ❗❗

在我们用C语言且没有实现回调函数时,实现一个简易计算器通常是这样的:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Add(int x, int y)
{
  return x + y;
}
 
int Sub(int x, int y)
{
  return x - y;
}
 
int Mul(int x, int y)
{
  return x * y;
}
 
int Div(int x, int y)
{
  return x / y;
}
 
 
void menu()
{
  printf("***************************\n");
  printf("***** 1.add    2. sub  ****\n");
  printf("***** 3.mul    4. div  ****\n");
  printf("***** 0.exit           ****\n");
  printf("***************************\n");
}
 
int main()
{
  int input = 0;
  int x = 0;
  int y = 0;
  int ret = 0;
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    
    switch (input)
    {
    case 1:
      printf("请输入2个操作数:>");
      scanf("%d %d", &x, &y);
      ret = Add(x, y);
      printf("%d\n", ret);
      break;
    case 2: 
      printf("请输入2个操作数:>");
      scanf("%d %d", &x, &y);
      ret = Sub(x, y);
      printf("%d\n", ret);
      break;
    case 3:
      printf("请输入2个操作数:>");
      scanf("%d %d", &x, &y);
      ret = Mul(x, y);
      printf("%d\n", ret);
      break;
    case 4:
      printf("请输入2个操作数:>");
      scanf("%d %d", &x, &y);
      ret = Div(x, y);
      printf("%d\n", ret);
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
}

这样写代码虽然是可以正常运行的,但是代码显得十分冗余,有许多的重复的代码:

在这种情况下,我们就可以利用回调函数来巧妙地解决这个问题:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Add(int x, int y)
{
  return x + y;
}
 
int Sub(int x, int y)
{
  return x - y;
}
 
int Mul(int x, int y)
{
  return x * y;
}
 
int Div(int x, int y)
{
  return x / y;
}
void Cal(int (*p)(int, int))
{
  int x = 0;
  int y = 0;
  int ret = 0;
  printf("请输入2个操作数:>");
  scanf("%d %d", &x, &y);
  ret = p(x, y);
  printf("%d\n", ret);
}
 
void menu()
{
  printf("***************************\n");
  printf("***** 1.add    2. sub  ****\n");
  printf("***** 3.mul    4. div  ****\n");
  printf("***** 0.exit           ****\n");
  printf("***************************\n");
}
 
int main()
{
  int input = 0;
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    
    switch (input)
    {
    case 1:
      Cal(Add);
      break;
    case 2: 
      Cal(Sub);
      break;
    case 3:
      Cal(Mul);
      break;
    case 4:
      Cal(Div);
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
}

回调函数还有一个重要应用,就是在我们C语言的库函数提供的qsort(快速排序)中:

  • base——待排序数组的首地址
  • num——待排序数组的长度
  • size——待排序数组中每个元素的大小
  • compar——指向比较两个元素的函数的指针

在qsort函数中就使用了回调函数,就是调用了compar这个函数:

对qsort进行应用演示:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compar(const void* e1, const void* e2)
{
  return strcmp((char*)e1,(char*)e2);
}
void print(char arr[][10], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%s ", arr[i]);
  }
  printf("\n");
}
 
int main()
{
  char str_arr1[][10] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
  int size = sizeof(str_arr1) / sizeof(str_arr1[0]);
  qsort(str_arr1, size, sizeof(str_arr1[0]), compar);
    print(str_arr1, size);
  return 0;
}


运行结果为:




目录
相关文章
|
1月前
|
搜索推荐 C语言
c语言从入门到实战——回调函数与qsort的讲解和模拟实现
回调函数是一个函数,它作为参数传递给另一个函数,并且能够在该函数内部被调用。在C语言中,回调函数通常被用于实现事件处理和排序算法中。 `qsort`是C标准库中的一个排序函数,它可以对任意类型的数组进行排序。`qsort`需要三个参数:要排序的数组、数组元素的个数和一个指向回调函数的指针。回调函数必须满足两个条件:能够比较数组中的元素,返回一个整数表示它们之间的大小关系;并且它应该能够被`qsort`函数调用。 回调函数是一种在编程中广泛使用的技术,它允许一个函数作为参数传递给另一个函数,并在需要时被调用。这种机制使得代码更加灵活和可重用。
36 0
|
1月前
|
C语言
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)
44 0
|
8月前
|
C语言
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
56 0
|
9月前
|
Unix Linux API
深入浅出剖析C语言函数指针与回调函数
深入浅出剖析C语言函数指针与回调函数
109 1
|
9月前
|
Linux C语言 开发者
深入浅出剖析C语言函数指针与回调函数(二)
深入浅出剖析C语言函数指针与回调函数(二)
49 0
|
8月前
|
搜索推荐 程序员 编译器
神奇的库函数qsort【详解指向函数指针数组的指针、回调函数、模拟实现qsort函数】【C语言/指针/进阶/程序员内功修炼】【下】
神奇的库函数qsort【详解指向函数指针数组的指针、回调函数、模拟实现qsort函数】【C语言/指针/进阶/程序员内功修炼】【下】
49 0
|
1月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
25 0
|
12天前
|
SQL 数据库 C语言
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
|
1月前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
16 2
|
1月前
|
存储 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(中)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
26 0