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