指向函数指针数组的指针。
int main()
{
int (*pf)(int, int) = &Add;
//函数指针。
int(*pfarr[4])(int,int);
//函数指针数组。
int (*(* p3)[4])(int, int) = &pfarr;
//p3是一个指向函数指针数组的指针
}
回调函数
通过函数指针调用的函数,把函数的指针(地址)作为参数传递给另一个函数,使这个指针被用来调用其所指向函数。
void test()
{
printf("hehe\n");
}
void print_hehe(void (*p)())
{
if (1)
p();
}
int main()
{
print_hehe(test);
return 0;
}
qsort函数
void qsort( void *base, size_t num, size_t width, int (*cmp)(const void *e1, const void *e2 ) );
//使用库函数<stdlib.h>。
//后面的*cmp是一个函数指针。
//base存放的是待排序数组的起始位置。
//num是数组的元素个数。
//width是一个元素的字节大小。
//e1,e2是待排序的两个元素地址。
//当e1小于e2,返回<0的数字。
//当e1大于e2,返回>0的数字。
//当e1等于e2,返回0。
int cmp_int(const void* e1, const void* e2)
{
/*if (*(int*)e1 > *(int*)e2)
return 1;
else if (*(int*)e1 == *(int*)e2)
return 0;
else
return -1;*/
//或者:
return (*(int*)e1 - * (int*)e2);
}
//void*类型的数据要进行强制转换。
void test2()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//排序为升序
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
//使用cmp_int来接受函数指针。
print_arr(arr, sz);
}
使用qsort排序结构体:
struct Stu
{
char name[20];
int age;
double score;
};
int cmp_stu_by_age(const void* e1, const void*e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照年龄来排序。
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp( ((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}
//按照名字来排序,使用strcmp来进行字符比较。
void test3()
{
struct Stu arr[3] = { {"zhangsan", 20, 55.5},{"lisi", 30, 88.0},{"wangwu", 10, 90.0}};
int sz = sizeof(arr) / sizeof(arr[0]);
//qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}
注意:
qsort默认排的是升序,要改成降序可以利用反逻辑的原理,返回值中颠倒数据,例如:
int cmp_stu_by_age(const void* e1, const void*e2)
{
return ((struct Stu*)e2)->age - ((struct Stu*)e1)->age;
}
//把e1和e2位置交换。