函数指针的声明和使用

    技术2022-05-19  20

    #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;             }         }     } }

     

     

    从今天开始我要做一个自由的人,喂马、劈柴,神游世界。


    最新回复(0)