上山打老虎 发表于 2021-7-30 23:45:15

c语言_Day29_07_30

c语言_Day29_07_30
1、指针深入
1、回调函数
回调函数:通过函数指针调用的函数。常用于作为另一个函数的形参,当某特定事件触发时,该回调函数才会被调用。
void Print1(char str)
{
printf("print1:%s\n", str);
}
void Print2(char str)
{
printf("print2:%s\n", str);
}

void test(void(*fun)(char))
{
printf("test\n");
fun("Hello");
}

int main()
{
test(Print1);
test(Print2);
return 0;
}实现qsort函数
void:可接收任意类型地址的指针(由于访问权限未知,故无法对其解引用)
理解qsort函数:
参数:
base待排序的数组
num:数组元素个数
width:元素大小
cmp:比较函数指针(回调函数)
设计cmp函数:
参数:
e1,e2:void*指针
函数体:
比较e1和e2指向的元素(e1和e2解引用前需强制类型转换)
返回值:
<0 e1小于e2
=0 e1等于e2
\> e1大于e2
实用库函数qsort:
typedef struct Student
{
char name;
int age;
}Student;
int cmp_d(const void e1, const void e2)
{
if (*(double)e1 > (double*)e2)
{

      return 1;
    }
    else if (*(double*)e1 == *(double*)e2)
    {
      return 0;
    }
    else
    {
      return -1;
    }}
int cmp_stu(const void e1, const void e2)
{int e1_age = ((Student*)e1)->age;
int e2_age = ((Student)e2)->age;
if (e1_age > e2_age)
{

      return 1;
    }
    else if (e1_age = e2_age)
    {
      return 0;
    }
    else
    {
      return -1;
    }}
int main()
{Student stu1 = { "Tom", 19 };
Student stu2 = { "Lily", 16 };
Student stu3 = { "Bob", 23 };
Student arr_stu = { stu1, stu2, stu3 };
int len_stu = sizeof arr_stu / sizeof arr_stu;
double arr_d = { 1.2, 3.1, 5.3, 0.5, 2.2 };
int len_d = sizeof arr_d / sizeof arr_d;
qsort(arr_d, len_d, sizeof arr_d, cmp_d);
for (int i = 0; i < len_d; i++)
{

      printf("%lf\n", arr_d);
    }
    printf("---------------------------\n");qsort(arr_stu, len_stu, sizeof arr_stu, cmp_stu);
for (int i = 0; i < len_stu; i++)
{

      printf("%d\n", arr_stu.age);
    }return 0;
}实现函数:

void MyBubbleSort(void arr, int len, int size, int (*cmp)(const void e1, const void e2))
{
for (int i = len; i > 1; i--)
{

      for (int j = 0; j &lt; i - 1; j++)
      {
            // 比较
            // 巧用char*(1步长)
            if (cmp((char*)arr + j * size, (char*)arr + (j + 1) * size) &gt; 0)   
            {
                // 交换
                char* buf1 = (char*)arr + j * size;
                char* buf2 = (char*)arr + (j + 1) * size;
                for (int k = 0; k &lt; size; k++)
                {
                  char tmp = *buf1;
                  *buf1 = *buf2;
                  *buf2 = tmp;
                  buf1++;
                  buf2++;
                }
            }
      }
    }}
int cmp_f(const void* e1, const void e2)
{//return (int)((float*)e1 - (float)e2);
if (*(float)e1 > (float*)e2)
{

      return 1;
    }
    else if (*(float*)e1 == *(float*)e2)
    {
      return 0;
    }
    else
    {
      return -1;
    }}
int main()
{float arr[] = { 1.2f, 3.4f, 0.2f, 4.3f, 2.5f };
int len = sizeof arr / sizeof arr;
int size = sizeof arr;
MyBubbleSort(arr, len, size, cmp_f);
return 0;
}
文档来源:51CTO技术博客https://blog.51cto.com/u_15285915/3237383
页: [1]
查看完整版本: c语言_Day29_07_30