1:回调函数
回调函数就是一个通过函数指针调用的函数。
如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其他所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
2:qsort函数的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void print1(int arr[], int sz)
{
int* p = arr;
for ( int j = 0; j < sz; j++)
{
printf("%d ", p[j]);
}
}struct stu
{
char name[1314];
int age;
char sex[520];
};void print2(struct stu arr[], int sz)
{
for (int j = 0; j < sz; j++)
{
printf("%s %d %s\n", arr[j].name, arr[j].age, arr[j].sex);
}
}
int int_cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void test1()
{
int arr[] = { 2,3,5,7,8,6,9,0,1,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(int), int_cmp); //没有头文件
print1(arr,sz);
}
int cmp_s_age(const void*a1,const void*a2)
{
return ((struct stu*)a1)->age - ((struct stu*)a2)->age;
}
int cmp_s_name(const void*e1,const void*e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
void test2()
{
struct stu s[] = { {"xiaomin",19,"boy"},{"xiaohong",18,"girl"},{"xiaogang",24,"boy"} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_s_age);
print2(s, sz);
printf("\n");
qsort(s, sz, sizeof(s[0]), cmp_s_name);
print2(s, sz);
}int main()
{
test1();
printf("\n");
test2();
return 0;
}
上面代给出了整型和结构体使用qsort函数排序,还涉及使用指针对整型和结构体数组的打印。
qsort(数组名,数组个数,数组长度,比较函数);
这个是qsort函数的参数个数,其中最重要的是比较函数的设计。
比较函数的返回值为int,参数为两个const void*的指针;返回值需要强制类型转换,而且需要比较后返回整型。
3:qsort函数的模拟实现,冒泡排序
int int_cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)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, 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);
}
}
}
}int main()
{
int arr[] = { 0,8,6,4,3,2,9,7,1,5 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = &arr;
bubble(arr, sz, sizeof(arr[0]), int_cmp);
for(i = 0; i < sz; i++)
{
printf("%d ", p[i]);
}
return 0;
}
参照qsort函数,设计函数,遵照qsort(数组名,数组元素个数,数组元素大小,比较函数)的参内容进行设计。