函数指针
- 函数指针:指向函数的指针,函数名就相当于一个函数指针。
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, 表示不排序
- 示例:
- 输出结果:15 20 24
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
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);
}
}
推荐阅读
- C++ 中的 Lambda 表达式
- C/C++|C++四种强制类型转换总结
- c/c++|c++四种强制类型转换
- C/C++|C++四种类型转换运算符详解
- c/c++|华东理工某ACMer总结
- C|C语言深度解剖篇——关键字&&补充内容
- C/C++详解如何实现文件备份
- 数据结构|【数据结构周周练】008 二叉树的链式创建及测试
- C/C++如何合并PDF文件在一起(详细源码)