1、回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
具体应用过程基本如下:
(1)定义一个回调函数;
(2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
(3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
2、qsort的应用
- void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
qsort函数实现了一种快速排序算法来对num元素的数组进行排序,每一个都是宽度字节。参数基是一个指向数组基础的指针。qsort将这个数组改写为已排序的元素。参数比较是一个指向用户提供的例程的指针,它比较两个数组元素并返回指定它们关系的值。
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
int cmp_char(const void *x, const void *y)
{
char *_x = (char *)x;
char *_y = (char *)y;
return *_x > *_y ? 1 : *_x< *_y ? -1 : 0;
}
int main()
{
char a[] = {2,23,123,21,5,6,78,9,0,45};
int size = sizeof(a)/sizeof(a[0]);
qsort(a , size, sizeof(char), cmp_char);
return 0;
}
3、my_qsort(利用冒泡排序)
#include <stdio.h>
#include <assert.h>
int cmp_int(const void *x, const void *y)
{
int *_x = (int *)x;
int *_y = (int *)y;
return *_x > *_y ? 1 : *_x< *_y ? -1 : 0;
}
void my_swap(void *p, void *q, int size)
{
int i = 0;
char tmp = 0;
assert(p);
assert(q);
for(i=0; i<size; i++)
{
tmp = *((char*)p+i);
*((char*)p+i) = *((char*)q+i);
*((char*)q+i) = tmp;
}
}
void my_qsort(void *base, int num, int size, int(*cmp)(void *, void *))
{
int i = 0;
int j = 0;
for(i=0; i<num-1 ;i++)
{
int flag = 1;
for(j=0; j<num-1-i; j++)
{
//自己写的比较函数
if(cmp((char*)base + j*size, (char*)base + (j+1)*size) >0)
{
my_swap((char*)base + j*size, (char*)base + (j+1)*size, size);
flag = 0;
}
}
if(flag)
return;
}
}
int main()
{
int a[] = {1,324,435,7,8,99,4,2,34,123};
int size = sizeof(a)/sizeof(a[0]);
my_qsort(a, size, sizeof(int), cmp_int);
return 0;
}