指向函数的指针
#include
#include
using namespace std;
int compare_int(const void* a, const void* b) {
int* a1 = (int*)a;
int* b1 = (int*)b;
return *a1 - *b1;
}
int compare_char(const void* a, const void* b) {
char a1 = *(char*)a;
char b1 = *(char*)b;
if (a1 >= 'A' && a1 <= 'Z') a1 += 32;
if (b1 >= 'A' && b1 <= 'Z') b1 += 32;
return a1 - b1;
}
int main(void) {
int x = 20;
int y = 10;
//定义一个指向函数的指针,就是把函数声明移过来
//把函数名改成(*函数指针名), 其他都不变(形参名可以省略!)
int (*fp)(const void*, const void*);
//把函数的地址赋值给函数指针
fp = &compare_int;
//贝尔实验室的C和UNIX的开发者采用第1种形式,
//而伯克利的UNIX推广者却采用第2 种形式ANSI C 兼容了两种方式
//方式一, 按普通指针解引的放式进行调用
//(*fp)(&x, &y); //相当于调用 compare_int(&x, &y);
//方式二, 直接调用
//fp(&x, &y);
//对arr整形数组进行快速排序, 调用qsort函数
int arr[] = { 2, 10, 30, 1, 11, 8, 7, 111, 520 };
int len = sizeof(arr) / sizeof(arr[0]);
qsort(arr, len, sizeof(arr[0]), (*fp));
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
//对arrc字符数组进行快速排序, 调用qsort函数
char arrc[] = { "abcdefghiABCDEFGHI" };
int len1 = (sizeof(arrc)-1) / sizeof(arrc[0]);
int (*cp)(const void*, const void*);
cp = &compare_char;
qsort(arrc, len1, sizeof(arrc[0]), cp);
for (int i = 0; i < len1; i++) {
cout << arrc[i] << " ";
}
cout << endl;
system("pause");
return 0;
}