回调函数与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;
}


目录
相关文章
|
9月前
浅学指针(2)数组函数传值调用
浅学指针(2)数组函数传值调用
|
3月前
|
存储
如何将数组元素中的函数作为参数传递给其他函数?
通过以上方法,可以灵活地将数组元素中的函数作为参数传递给其他函数,以满足各种不同的编程需求,实现更加强大的功能和更简洁的代码结构。
116 51
|
编译器 C++
指针进阶 - 2(数组参数和指针参数)
指针进阶 - 2(数组参数和指针参数)
88 0
|
9月前
|
C语言
用指针函数变量调用函数
用指针函数变量调用函数
33 2
传值调用与传址调用
传值调用与传址调用
77 0
|
搜索推荐 编译器 C++
指针进阶:函数指针 && 回调函数(真正理解qsort)
指针进阶:函数指针 && 回调函数(真正理解qsort)
【C】回调函数和qsort详解
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一 个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该 函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或 条件进行响应。
|
存储 C语言
【C语言】回调函数(qsort)与模拟实现
【C语言】回调函数(qsort)与模拟实现
82 0
函数的传值调用和传址调用
函数的传值调用和传址调用
|
编译器 C语言
回调函数与位运算
在C语言中回调函数是函数指针的高级应用。所谓回调函数,一个笼统简单的介绍就是一个被作为参数传递的函数。从字面上看,回调函数的意思是:一个回去调用的函数,如何理解这句话呢?从逻辑上分析,要“回去”,必然存在着一个已知的目的地,然后在某一个时刻去访问;那么回调函数就是存在一个已知的函数体A,将这个函数体A的地址即函数名“A”(函数名即是这个函数体的函数指针,指向这个函数的地告知给另外某个函数B,当那个函数B执行到某一步的时候就会去执行函数A。
110 0
回调函数与位运算

热门文章

最新文章