通过冒泡排序的快速排序练习使用回调函数

来源:互联网 发布:睡衣 知乎 编辑:程序博客网 时间:2024/06/09 17:54

首先什么是回调函数?回调函数是什么?

函数指针作为调用函数的参数,通过这个指针可以回调这个指针指向的函数,这样的技巧就是利用回调函数,回调函数就是这个指针指向的函数。

一个简单的例子:

<span style="font-size:18px;">#include<stdio.h>#include<stdlib.h>void fun(){printf("hello ");}void pfun(void (*p)())    //函数的参数是一个函数指针(是一个地址){p();             //在内部通过函数指针来调用指向的函数printf("world\n");}int main(){void (*q)();   //定义一个函数指针q = fun;       //指向fun()pfun(q);system("pause");return 0;}</span>

结果是这样的:

可以看到pfun()函数通过函数指针调用到了fun()这个函数,我们这个时候可以称fun()是个回调函数,下面是对冒泡排序使用回调函数用例

#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h> /*指针数组的比较函数<span style="color:#ff0000;font-weight: bold;">函数接受的是指针数组的元素的地址,指针数组元素的内容是一个指针所以接收到之后进行强制转换成(int *)再解引用得到字符串的首地址强制转换成(char *)进行操作</span>*/int cmpstr(const void *elem1, const void *elem2){assert(elem1&&elem2);return strcmp((char *)(*(int *)elem1), (char *)(*(int *)elem2));}/*字符数组的比较*/int cmpch(const void *elem1, const void *elem2){assert(elem1&&elem2);return *(char *)elem1 - *(char *)elem2;}/*整形数组的比较*/int cmpint(const void *elem1, const void *elem2){assert(elem1&&elem2);return *(int *)elem1 - *(int *)elem2;}/*交换函数交换的时候是以字节为单位交换<span style="color:#ff0000;"><strong>这样的话必须显示的给出数据类型的字节数</strong></span>*/void swap(void *elem1, void *elem2, int width)  //函数接收的是无类型的指针所以一定要进行类型转换{assert(elem1&&elem2);int i = 0;for (i = 0; i < width; i++){char tmp = *((char*)elem1+i);*((char *)elem1+i) = *((char*)elem2+i);*((char*)elem2+i) = tmp;}}/******************************************<span style="color:#ff0000;"><strong>冒泡排序的快速排序函数接收base数组名sz数组大小width数组元素的大小(字节)int(*compare)(const void *elem1, const void *elem2)一个函数指针这个函数主要是利用函数指针通过回调函数来实现调用者的参数是一个函数指针,通过这个指针可以调用函数这样调用者可以和被调用者分开提高了可移植性</strong></span>*/void bubble(void *base, int sz, int width, int(*compare)(const void *elem1, const void *elem2)){int i = 0;int j = 0;for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - 1 - i; j++){if (compare((char *)base + j*width, (char *)base + (j + 1)*width)>0){   <span style="color:#ff0000;">//将数组名强制转换成(char *)对字节进行操作</span>swap((char *)base + j*width, (char *)base + (j + 1)*width, width);}}}}/*****************************测试用例*/int main(){int i = 0;char *p[3] = { "aaaaa", "eeeee", "bbbbb" };int b[5] = { 1, 9, 3, 5, 4 };char c[5] = { 'a', 'r', 'd', 'c', 'b' };bubble(p, sizeof(p) / sizeof(p[0]), sizeof(char *), cmpstr);bubble(b, sizeof(b) / sizeof(b[0]), sizeof(int), cmpint);bubble(c, sizeof(c) / sizeof(c[0]), sizeof(char), cmpch);for (i = 0; i < sizeof(p) / sizeof(p[0]); i++){printf("%s ", p[i]);}printf("\n");for (i = 0; i < sizeof(b) / sizeof(b[0]); i++){printf("%d ", b[i]);}printf("\n");for (i = 0; i < sizeof(c) / sizeof(c[0]); i++){printf("%c ", c[i]);}printf("\n");system("pause");return 0;}
测试结果是这样的:


具体的分析都在程序中注释。

回调函数的应用还是建立在指针之上的,所以熟练的掌握c指针是我们学习c语言的重中之重!!!!



1 0
原创粉丝点击