关于函数指针数组的指针及回调函数,qsort的使用
关于函数指针数组的指针,首先它是一个指针,这个指针指向一个数组,数组中的元素都是函数指针. 关于函数指针数组的指针的定义
#include <stdio.h> #include <stdlib.h> void test(const char* str){ printf("%s ", str); } int main(){ //函数指针pfun void (*pfun)(const char*) = test; //函数指针数组pfunarr void (*pfunarr[5])(const char* str); pfunarr[0] = test; //指向函数指针数组的指针 void (*(*ppfunarr)[5])(const char*) = &pfunarr; system("pause"); return 0; }
回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数指针作为一个参数传递给另外一个函数,当这个指针被用来调用其他所指向的函数时,我们就说这是回调函数. qsort函数的使用:
#include <stdio.h> #include <stdlib.h> int cmp(const void* p1, const void* p2){ return (*(int*)p1) - (*(int*)p2); } int main(){ int a[] = { 2, 4, 3, 1, 7, 8, 9, 10, 5, 11, 0 }; int n = sizeof(a) / sizeof(a[0]); int i; qsort(a, n, sizeof(int), cmp); for (i = 0; i < n; ++i){ printf("%d ",a[i]); } system("pause"); return 0; }
使用回调函数,模拟实现qsort
#include <stdio.h> #include <stdlib.h> int cmp(const void* p1, const void* p2){ return (*(int*)p1) - (*(int*)p2); } void Swap(void* p1, void* p2, int size){ int i; char tmp; for (i = 0; i < size; ++i){ tmp = *((char*)p1 + i); *((char*)p1 + i) = *((char*)p2 + i); *((char*)p2 + i) = tmp; } } void BabbleSort(void* data, int n, int size, int (*cmp)(void*, void*)){ int i = 0; int j = 0; for (i = 0; i < n - 1; ++i){ for (j = 0; j < n - 1 -i; ++j){ if (cmp((char*)data + j * size, (char*)data + (j + 1) * size) > 0){ Swap((char*)data + j * size, (char*)data + (j + 1) * size, size); } } } } int main(){ int a[] = { 2, 4, 3, 1, 7, 8, 9, 10, 5, 11, 0 }; int n = sizeof(a) / sizeof(a[0]); int i; BabbleSort(a, n, sizeof(int), cmp); for (i = 0; i < n; ++i){ printf("%d ",a[i]); } system("pause"); return 0; }