函数指针的声明和使用

来源:互联网 发布:知彼而知己博客 编辑:程序博客网 时间:2024/06/14 17:39

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

 

 

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

原创粉丝点击