函数指针
- 函数指针:指向函数的指针,函数名就相当于一个函数指针。
函数指针的定义
int add(int a,int b){ return a+b;}int main(){ printf("%p", add); printf("%p", &add); //两个输入后果雷同,add和&add都是失去函数的地址 int (*pf)(int, int) = add; //定义函数指针 //(*pf)示意变量pf是一个指针,(int, int)示意函数的参数类型,int 示意函数的返回值}
函数指针的应用
int (*pf)(int, int) = add; //定义函数指针int ret = (*pf)(2,3);//(2,3)示意传递的参数,(*pf)解援用函数,调用函数,留神这个括号不能省略。int ret = pf(2,3); //pf其实就相当于add。
简单函数指针类型解读
(*(void(*)())0)();//首先最内层:(*)示意它是一个指针//其次:void(*)() 这是一个定义函数指针的变量类型,返回值为void,无传参。//(void(*)())0 变量类型被放在括号中,示意强制类型转换,将0转化为函数指针,这示意0地址处寄存的是一个函数地址//*(void(*)())0 解援用这个函数指针,调用函数//(*(void(*)())0)() 最初的括号示意函数传参。//这句程序的作用是:调用0地址处的函数
void (*add(int,void(*)(int)))(int);//首先最内层:void(*)(int) 示意一个函数指针类型//其次:add(int,void(*)(int)) ;add示意函数名,(int,void(*)(int))示意这个函数的参数//当去掉add(int,void(*)(int))之后,只剩下void (*)(int),而void (*)(int)就是函数的返回类型//所以这句程序的意思:定义一个函数,函数名为add,传参为(int,void(*)(int)),返回值为void (*)(int)型//其实就相当于:void (*)(int) add(int,void(*)(int)) //然而留神下面这个写法是错的,只是能够这样了解上述程序。//能够应用另外一种办法实现上述程序typedef void(*pf_t)(int) ; //重定义类型,将void(*)(int)类型用pf_t代替pf_t add(int, pf_t); //这句成果和上述程序雷同。
函数指针数组
int (*p[3])(int,int) = {test1,test2,test3}; //定义函数指针数组p[3]。int ret = p[1](3,5); //应用函数指针数组
指向函数指针数组的指针
int (*pf[4])(int, int); //函数指针数组//pf先与[4]联合示意它是一个数组int (*(*p)[4])(int, int) = &pf; //指向函数指针数组的指针//p先与*号联合,示意它是一个指针int ret = (*p)[1](3,4); //指向函数指针数组的指针的应用//(*p)先解援用失去函数指针数组,(*p)就相当于pf,[1]示意应用第哪个函数,(3,4)示意传参。
C库排序函数qsort()
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))//base -- 指向要排序的数组的第一个元素的指针。//nitems -- 要排序数组中元素的个数.//size -- 数组中每个元素的大小,以字节为单位//compar -- 用来比拟两个元素的函数,这个函数须要程序员本人依据理论状况写//compar 函数只须要比拟第一个参数和第二个参数的大小并返回即可//返回值为正,则示意正序排列//返回值为负,则示意反序排列//返回值为0, 示意不排序
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>struct Stu{ char name[10]; int age; double score;};int compar(const void* e1, const void* e2){ return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;}void main(){ struct Stu arr[3] = { {"zhangsan",20,55.5},{"lishi",24,57.0},{"wangwu",15,34.2} }; int sz = sizeof(arr) / sizeof(arr[0]); //计算要排序数组中元素的个数 qsort(arr, sz, sizeof(arr[0]), compar); for (int i = 0; i < 3; i++) { printf("%d\n", arr[i].age); }}