本人C语言学习笔记
函数指针简介
函数名称的本质是一个函数指针(隐式转换),用来指向函数地址。在VS中程序每次运行函数地址都不同,而在Qt中是不变的。
直接定义法:返回值类型(*函数指针名)(参数列表)
如在Qt程序中有函数void test(int a);且用qDebug(“%d”,test)打印出函数地址为4199952,
可有void(*pFunc)(int) = (void(*)(int))4199952;
等式右值强转在C语言中可省略,C++要有
然后pFunc(1);即可调用函数,相当于text(1);
定义方法
和定义数组类型相似,除了前文的直接定义法(通常直接定义法可以利用编译器的提示功能,先用个int*接收然后生成看提示,简单好记也最常用,如果不需要创建多个对象的话),还有两种方法。
函数指针数组
即内容是函数指针的指针数组,定义时索引[]应当在函数指针数组名后面,如void(*pFunc[3])(int);然后pFunc[1]=func1; pFunc[2]=func2; pFunc[3]=func3;再用循环可以依次调用。
函数指针数组必须函数格式都一样,即返回值、参数列表相同。
函数指针做函数参数(回调函数)
回调函数,一开始不能确定某些参数类型,故要由用户先提供确定,再回头调用函数。实际工作中更多地是提供回调函数去使用别人的接口,而不是自己写。
提供一个printAllArray()函数,能够打印任意类型的数组,先尽量万能地接收要打印的数组相关参数和用户的函数指针,尽量预处理后涉及到具体参数类型的操作交给用户提供的myPrintInt(),也就是把其他的都封装好,留一个含函数指针的接口给用户。通常vs提示参数为pred什么的就是要传入一个回调函数。
回调函数案例
查找任意类型的数组中的元素是否存在findArrayEle()
用户提供的函数如下:
即可查询指定数据