c语言_Day29_07_30
c语言_Day29_07_301、指针深入
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 < i - 1; j++)
{
// 比较
// 巧用char*(1步长)
if (cmp((char*)arr + j * size, (char*)arr + (j + 1) * size) > 0)
{
// 交换
char* buf1 = (char*)arr + j * size;
char* buf2 = (char*)arr + (j + 1) * size;
for (int k = 0; k < 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]