【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

相关文章
|
2月前
|
C++
定义和使用指向函数的指针变量
定义和使用指向函数的指针变量
15 1
|
27天前
|
存储
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现2
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
27天前
|
C语言
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现1
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
7天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
12 0
|
27天前
|
搜索推荐 算法
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现4
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
2月前
|
安全 C语言 C++
字符指针做函数参数
字符指针做函数参数
10 1
|
2月前
|
安全 C语言
字符指针作函数参数的深入探索
在C语言编程中,字符指针是一个重要的概念,尤其在处理字符串和文本数据时。当我们将字符指针作为函数参数时,可以实现多种灵活和高效的操作。本文将深入探讨字符指针作为函数参数的应用,并通过代码示例加以说明。
15 1
|
2月前
|
存储 Shell C语言
指针数组组main函数的形参
指针数组组main函数的形参
10 0
|
20天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
20天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
27 0