回调函数与qsort函数

简介: 回调函数与qsort函数

一:回调函数

1:回调函数的定义

回调函数就是通过函数指针调用的那个函数。

如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用它所指向的函数时,这个所调用的函数即使回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件的使用


2:回调函数应用举例-简单计算器的实现

#include<stdio.h>
void menu()
{
  printf("*****************************\n");
  printf("*****1 add   2 sub***********\n");
  printf("*****3 mul   4 div***********\n");
  printf("*****0 exit    **************\n");
  printf("*****************************\n");
}
 void calc(int (*p)(int x, int y))
{
  int ret = 0;
  int a = 0;
  int b = 0;
  printf("请输入两个操作数:");
  scanf("%d %d", &a, &b);
  ret = p(a, b);//通过p指针调用函数
  //如果输入input=1;调用的函数就是add
  //通过指针p调用add函数,add函数就称为回调函数
  printf("%d\n", ret);
}
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;
}
int main()
{
  int input = 0;
  do
  {
    menu();
    printf("请选择:");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      calc(add);//add函数作为calc函数的参数
      break;
    case 2 :
      calc(sub);//sub函数作为calc函数的参数
      break;
    case 3:
      calc(mul);//mul函数作为calc函数的参数
      break;
    case 4:
      calc(div);//div函数作为calc函数的参数
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误,重新选择\n");
      break;
    }
  } while (input);
  return 0;
}
*****************************
*****1 add   2 sub***********
*****3 mul   4 div***********
*****0 exit    **************
*****************************
请选择:1
请输入两个操作数:2 3
5
*****************************
*****1 add   2 sub***********
*****3 mul   4 div***********
*****0 exit    **************
*****************************
请选择:2
请输入两个操作数:4 2
2
*****************************
*****1 add   2 sub***********
*****3 mul   4 div***********
*****0 exit    **************
*****************************
请选择:3
请输入两个操作数:4 3
12
*****************************
*****1 add   2 sub***********
*****3 mul   4 div***********
*****0 exit    **************
*****************************
请选择:4
请输入两个操作数:8 4
2
*****************************
*****1 add   2 sub***********
*****3 mul   4 div***********
*****0 exit    **************
*****************************
请选择:6
选择错误,重新选择
*****************************
*****1 add   2 sub***********
*****3 mul   4 div***********
*****0 exit    **************
*****************************
请选择:0
退出计算器

二:qsort函数

qsort是一个库函数,使用时需要头文件stdlib,qsort函数用于对数据进行排序,可以排序任意类型的数据。

qsort函数有4个参数
void qsort(void* base, //base指向待排序的第一个元素的地址
         size_t num,  //待排序的元素个数(base指向空间的数组的个数)
         size_t size, //待排序的数组元素的大小,单位是字节
         int (*compar)(const void* e1, const void* e2) 
          compar是一个函数指针,指向的函数能够比较2个元素
     int (*)(const void *e1,const void* e2)是函数指针类型
void* 是一种函数指针类型,是通用指针类型,是无具体类型的指针
void* 类型的指针变量,可以接收(存放)任意数据类型的地址
因为void*是无具体类型的指针,所以不可以进行+1/-1,解引用操作

qsort函数排序举例:

#include <stdio.h>
#include <stdlib.h>
 void Print(int* arr, int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", *(arr + i));
  }
  printf("\n");
}
 int cmp_int(const void* e1, const void* e2)
 {
   return *(int*)e1 - *(int*)e2;
   //e1,e2是void*类型,而需要比较的元素是int型的整型数组,
   //所以需要强制类型转换成(int*),再解引用
 }
void test(int *arr,int sz)
{
  qsort(arr, sz, sizeof(arr[0]),cmp_int);
  //cmp_int 是个函数指针,指向的函数可以比较两个函数。
}
int main()
{
  int arr[] = { 1,2,4,6,3,7,8,5,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  Print(arr, sz);
  test(arr,sz);
  Print(arr, sz);
  return 0;
}


目录
相关文章
|
6月前
回调函数,以qsort函数为例
回调函数,以qsort函数为例
28 0
|
算法 程序员 C语言
【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)
回调函数为C语言重要知识点,以函数指针为主要知识;下面介绍回调函数的定义、回调函数的库函数举例即库函数模拟实现。
52 0
【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)
|
11月前
函数指针和回调函数
简介 函数的二进制代码存放在内存四区中的代码区,函数的地址是它在内存中的起始地址。如果把函数的地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。 使用函数指针的三个步骤: 1.声明函数指针: 声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型是指返回值和参数列表(函数名和形参名不是) 函数之间具有相同的返回值类型和参数列表数目和类型都相同即是同一类函数
45 0
|
搜索推荐 编译器 C++
指针进阶:函数指针 && 回调函数(真正理解qsort)
指针进阶:函数指针 && 回调函数(真正理解qsort)
|
存储 编译器 C语言
回调函数的应用(sqort函数)——指针进阶(三)
回调函数的应用(sqort函数)——指针进阶(三)
35 0
|
存储 算法 测试技术
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
45 0
【C】回调函数和qsort详解
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一 个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该 函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或 条件进行响应。
|
C语言 C++
深入理解回调函数qsort:从入门到模拟实现(下)
深入理解回调函数qsort:从入门到模拟实现(下)
45 0
|
搜索推荐 C语言
深入理解回调函数qsort:从入门到模拟实现(上)
深入理解回调函数qsort:从入门到模拟实现(上)
84 0
|
存储 C语言
【C语言】回调函数(qsort)与模拟实现
【C语言】回调函数(qsort)与模拟实现
69 0