【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现3

简介: 【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现

【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现2:https://developer.aliyun.com/article/1474741

二、回调函数是什么?

C语言中的回调函数是指在函数调用的过程中,被另外一个函数作为参数传递并调用的函数。

回调函数的主要特征如下:

  1. 回调函数必须事先定义。
  2. 回调函数的地址作为参数传递给另一个函数,这个函数称为主函数。
  3. 主函数在适当的时候,通过调用回调函数的地址来调用回调函数。

一个典型的回调函数使用场景例子:

// 回调函数定义
void callback_func(int value) 
{
  printf("value is %d\n", value);
}

// 主函数定义
void main_func(void (*callback)(int)) 
{
  int num = 10;
  
  // 调用回调函数
  callback(num); 
}

int main() 
{
  // 注册回调函数
  main_func(callback_func);
  
  return 0;
}

注:回调函数的特点是函数的调用关系由使用者在运行时决定,而不是在编译时就确定,这提供了更大的灵活性。

那可不可以使用回调函数实现计算器呢?

  1. 定义一个通用的计算函数calc,它接收一个函数指针作为参数。
  2. main函数中,根据用户选择直接调用calc函数,并传入相应的运算函数。
  3. 回调函数是Add、Sub、Mul、Div

void menu()
{
  printf("******************************\n");
  printf("****  1. add     2. sub   ****\n");
  printf("****  3. mul     4. div   ****\n");
  printf("****  0. exit             ****\n");
  printf("******************************\n");
}

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;
}


//calc功能强大了

void calc(int (*pf)(int,int))
{
  int x = 0;
  int y = 0;
  int ret = 0;
  printf("请输入两个操作数:");
  scanf("%d %d", &x, &y);
  ret = pf(x, y);
  printf("%d\n", ret);
}

int main()
{
  int input = 0;
  
  do
  {
    menu();
    printf("请选择:");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      calc(Add);//完成计算  
      break;
    case 2:
      calc(Sub);
      break;
    case 3:
      calc(Mul);
      break;
    case 4:
      calc(Div);
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误,重新选择\n");
      break;
    }
  } while (input);

  return 0;
}

三、qsort函数细解

3.1 类比冒泡排序?通过前面我们学过冒泡排序qsort函数的排序让我们类比一下:

void bubble_sort(int arr[], int sz)
{
  //趟数
  int i = 0;
  for (i = 0; i < sz - 1; i++)
  {
    //一趟冒泡排序的过程
    //两两相邻元素的比较
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        int tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
}
void print_arr(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
}

int main()
{
  //将一组整数排序为升序
  int arr[10] = { 3,1,5,2,4,6,8,7,0,9 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  print_arr(arr, sz);
  bubble_sort(arr, sz);
  print_arr(arr, sz);
  return 0;
}

3.2 qosrt函数超详解

库函数的学习和查看⼯具很多,⽐如:

C/C++官⽅的链接:https://zh.cppreference.com/w/c/header

cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/

qsort函数是C标准库中用于对数组进行快速排序的函数。(注:qsort函数底层使用的排序算法就是快速排序。)

  • 函数原型:
void qsort(
    void* base,//base 指向了要排序的数组的第一个元素
    size_t num, //base指向的数组中的元素个数(待排序的数组的元素的个数)
    size_t size,//base指向的数组中元素的大小(单位是字节)
    int (*compar)(const void*p1, const void*p2)//函数指针 - 指针指向的函数是用来比较数组中的2个元素的
    );

.- [ ] 分析定义:


base指向要排序的数组首地址。


num表示数组元素个数。


size表示每个元素的大小,以字节为单位。


compar是比较函数,它接收两个void指针,返回值小于0表示第一个参数小于第二个参数,等于0表示相等,大于0表示第一个参数大于第二个参数。

] 特点:


qsort使用快速排序算法,时间复杂度为O(nlogn)。


调用qsort时,需要提供一个比较函数compar来判断两个元素的大小关系。


比较函数通过void指针间接访问元素,避免与数据类型绑定,实现了最大程度的通用性。


qsort会在内部调用比较函数多次对数组进行排序,这就是回调机制的实现。


qsort是inplace排序,不需要额外的空间。



【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现4:https://developer.aliyun.com/article/1474743

相关文章
|
14天前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
14天前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
29天前
|
C++
指针中的回调函数与qsort的深度理解与模拟
本文详细介绍了回调函数的概念及其在计算器简化中的应用,以及C++标准库函数qsort的原理和使用示例,包括冒泡排序的模拟实现。
15 1
|
1月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
16 1
|
1月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
21 2
|
2月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
3月前
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
46 9
|
3月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
5月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
45 0
|
5月前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调