//rorger, 2012,3,22
//contact me:jhcyd112@163.com
#include "iostream"
using namespace std;
void func(){
printf("Calling func...\n");
}
int funco(int a){
printf("Calling funco... parameter a:%d\n",a);
return 2*a;
}
void funcn(void* data){
printf("Calling funcn... parameter &data:0x%X\n",data);
}
void (*pfunc) ();
int (*pfunco) (int a);
void (*pfuncn) (void* data);
typedef void (*FUNC_HANDLER) ();
typedef int (*FUNCO_HANDLER)(int a);
typedef void (*FUNCN_HANDLER) (void* data);
void myCallThreeFunc(FUNC_HANDLER callBack1,FUNCO_HANDLER callback2,int number, FUNCN_HANDLER callback3, void* data){
printf("-----------Calling myCallThreeFunc-------------\n");
callBack1();
callback2(number);
callback3(data);
}
int main(){
pfunc = func;
pfunco=funco;
pfuncn=funcn;
printf("---------------Using Pointer--------------------\n");
(*pfunc)();
pfunc();
//不懂得为什么这样做也可以的朋友要明白 函数名就是指针变量
//另外一种理解是:int *a=5;
int result = (*pfunco) (5);
result = pfunco (result);
(*pfuncn)((void*)&result);
pfuncn((void*)&result);
printf("result:%d address:0x%X\n",result,&result);
//打印函数地址
printf("&pfunc:0x%X pfunc:0x%X *pfunc:0x%X \n &func:0x%X func:0x%X *func:0x%X\n",
&pfunc,pfunc,*pfunc,func,&func,(*func));
//看看和数据变量有什么区别
int a=5;
int *b = &a;
printf("&a:0x%X b:0x%X *b:0x%X &b:0x%X\n",&a,b,*b, &b);
//我个人看法是: 1.func本身是指向函数的入口地址,一个地址的地址&func还是本身, 一个地址所指向的地方*func还是函数本身。
//关键的一点是 func不是变量,是地址。三种情况对于编译器来说都是一样的
//2.pfunc是变量,指向函数入口地址的变量, 因此&pfunc有自己的分配内存,也就有自己的内存地址,
//pfunc的值是函数入口地址,*pfunc的值也是函数入口地址
//use typedef
printf("---------------Using typedef--------------------\n");
FUNC_HANDLER funcHandler = func;
FUNCO_HANDLER funcoHandler = funco;
FUNCN_HANDLER funcnHandler = funcn;
funcHandler();
result = funcoHandler(result);
funcnHandler((void*)&result);
myCallThreeFunc(func, funco, result, funcn,(void*)&result);
//use method call
system("pause");
return 0;
}
打印结果:
---------------Using Pointer--------------------
Calling func...
Calling func...
Calling funco... parameter a:5
Calling funco... parameter a:10
Calling funcn... parameter &data:0x2BF7AC
Calling funcn... parameter &data:0x2BF7AC
result:20 address:0x2BF7AC
&pfunc:0x9B813C pfunc:0x9B107D *pfunc:0x9B107D
&func:0x9B107D func:0x9B107D *func:0x9B107D
&a:0x2BF7A0 b:0x2BF7A0 *b:0x5 &b:0x2BF794
---------------Using typedef--------------------
Calling func...
Calling funco... parameter a:20
Calling funcn... parameter &data:0x2BF7AC
-----------Calling myCallThreeFunc-------------
Calling func...
Calling funco... parameter a:40
Calling funcn... parameter &data:0x2BF7AC
Press any key to continue . . .
想了解更多的朋友请点击这里:(别人概括的,很全啊)
http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html
http://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html
或者看c++类成员函数的例子: