#include <stdio.h> #include <Windows.h> class MyClass { public: int MemberFun(int) { printf("MyClass::MyFun is called/n"); return 0; } };
void MyFun() { printf("MyFun is called/n"); return ; } bool Compare(const BYTE* pb1, const BYTE* pb2) { //用于比较pb1 和 pb2 大小的函数 //... return true; } void main() { typedef void (*FUN)(); //这里定义了一个无参、返回值为空的函数指针类型 FUN fun = MyFun; //使用声明的类型定义一个函数指针,并使其指向现有的函数 fun(); //使用定义的函数指针调用现有的函数 //当然,也可以不用typedef void (*fun1)(); //这里定义了个无参、返回值为空的函数指针,注意“定义”和“声明”的不同 fun1 = MyFun; fun1(); //使用typedef只是使得看起来更直观,用起来方便 //现在定义一个函数指针数组 typedef void (*SZFUN[10])(); //hehe,很简单吧 SZFUN szfun; for(int i = 0;i < 10; ++i) { szfun[i] = MyFun; szfun[i](); } //不使用typedef也可以,如上 //那如果我们想将函数指针指向类的函数成员,怎么办? 加个类限定符啊 MyClass A; typedef int (MyClass::*CLASSFUN)(int); CLASSFUN classfun = &MyClass::MemberFun; (A.*classfun)(1); //说这么多函数指针,那到底函数指针在什么时候用到 // 1. 调用动态链接库中的函数 //调用动态链接库的函数有两种方法,1.在应用程序配置中加入lib文件 2.使用LoadLibrary(见我的其他文章里转载的一篇) //在使用LoadLibrary导入动态库中的函数时,我们需要定义一个与导入函数相一致的函数指针 //例如,我们要导入MyDll.dll中的dllFun函数,dllFun的声明如下 void dllFun(int); typedef void (*MYLOADFUN)(int); HMODULE hHINSTANCE; hHINSTANCE = LoadLibrary("MyDll.dll"); MYLOADFUN MyLoadFun = (MYLOADFUN)GetProcAddress(hHINSTANCE, "dllFun"); //这时,使用MyLoadFun就可以和dll文件中的函数一样,进行调用了。 // 2. 定义一个回调函数类型 typedef bool (*COMPAREFUN)(const BYTE*, const BYTE*); void Bubblesort(BYTE* btArray,int size,int elem_size,COMPAREFUN cmpFunc); COMPAREFUN MycmpFunc = Compare; BYTE* btArray = new BYTE[10]; Bubblesort(btArray, 10, 1, MycmpFunc); int a; scanf("%d",&a); } typedef bool (*COMPAREFUN)(const BYTE*, const BYTE*); void Bubblesort(BYTE* btArray,int size,int elem_size,COMPAREFUN cmpFunc) { for(int i = 0; i < size; ++i) { for(int j = 0; j < size-1; ++j) { if(1 == (*cmpFunc)(btArray+j*elem_size,btArray+(j+1)*elem_size)) { BYTE* temp = new BYTE[elem_size]; memcpy(temp, btArray+j*elem_size, elem_size); memcpy(btArray+j*elem_size, btArray+(j+1)*elem_size, elem_size); memcpy(btArray+(j+1)*elem_size, temp, elem_size); delete[] temp; } } } }