回调函数:
回调函数就是一个通过函数指针调用的函数,把函数的指针(地址)作为参数传递到另一个函数,当这个指针被用来调用其所指向的函数时,成为回调函数。
回调函数不是由该函数的实现方直接调用,,而是在事件或条件发生时由另一方调用。
回调函数就是函数指针的一种用法。
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
大神链接:
链接:https://www.zhihu.com/question/19801131/answer/13005983
来源:知乎
模仿 qsort 的功能实现一个通用的冒泡排序:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *p1, const void *p2)
{
return (*(char*)p1 - *(char*)p2);
}
void _swap(void *p1, void *p2, int size)
{
int i = 0;
for (i = 0;i < size;i++)
{
char tmp = *((char *)p1 + i);
*((char *)p1 + i) = *((char *)p2 + i);
*((char *)p2 + i) = tmp;
}
}
void bubble(void *base, int count, int size, int(*cmp)(void *, void *))
{
int i = 0;
int j = 0;
for (i = 0;i < count - 1;i++)
{
for (j = 0; j < count - i - 1;j++)
{
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
{
_swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}//(char*)base + j * size为a[j],(char*)base + (j + 1) * size为a[j + 1]
}
}
}
int main()
{
int arr[] = { 1, 3, 6, 7, 9, 8, 2, 4, 5 };
int i = 0;
bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp);//cmp回调函数
for (i = 0;i < sizeof(arr) / sizeof(arr[0]);i++)
{
printf("%d ", arr[i]);
}
printf("\n");
//char arr1[] = { 'aaa','ccc','ZZZ','YYY' };
char arr1[] = { 'a','c','Z','Y' };
bubble(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp);//cmp回调函数
for (i = 0;i < sizeof(arr1) / sizeof(arr1[0]);i++)
{
printf("%c ", arr1[i]);
}
printf("\n");
system("pause");
return 0;
}
void *则为“无类型指针”,void *可以指向任何类型的数据,在使用时也需要按照对应的类型进行强制转换。
使用qsort函数排序各类型数据:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp1(const void *x, const void *y)
{
return (*(int*)x - *(int*)y);
}
int cmp2(const void *x, const void *y)
{
return (*(char*)x - *(char*)y);
}
int cmp3(const void *x, const void *y)
{
return strcmp(*(char**)x , *(char**)y);
}
int cmp4(const void *x, const void *y)
{
return (*(double*)x - *(double*)y);
}
int main()
{
int i = 0;
//整形数组
int arr1[] = { 1,6,9,24,5 };
qsort(arr1, sizeof(arr1)/sizeof(arr1[0]), sizeof(arr1[0]), cmp1);
for (i = 0;i < sizeof(arr1) / sizeof(arr1[0]);i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
//字符数组
char arr2[] = { 'a','c','d','b','W','F','Z','Y' };
qsort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp2);
for (i = 0;i < sizeof(arr2) / sizeof(arr2[0]);i++)
{
printf("%c ", arr2[i]);
}
printf("\n");
//字符串
char *arr3[] = { "aaa","ddd","vvv","bbb" };
qsort(arr3, sizeof(arr3) / sizeof(*arr3), sizeof(*arr3), cmp3);
for (i = 0;i < sizeof(arr3) / sizeof(*arr3);i++)
{
printf("%s ", arr3[i]);
}
printf("\n");
//浮点数
double arr4[] = { 1.2 ,6.0 ,24.1 ,5.0 };
qsort(arr4, sizeof(arr4) / sizeof(arr4[0]), sizeof(arr4[0]), cmp4);
for (i = 0;i < sizeof(arr4) / sizeof(arr4[0]);i++)
{
printf("%f ", arr4[i]);
}
printf("\n");
system("pause");
return 0;
}