c 中函数指针,指向函数的指针, typedef 函数的指针例子。

//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++类成员函数的例子:

http://blog.csdn.net/rorger/article/details/7385432 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值