逛论坛看到一个问题,本来开始以为很简单,但是写出来的,编译通过,但是运行就是不通过,后来意识到问题的严重性,这里面肯定隐藏了自己不知道的东西,于是搞了一个早上,总算把结果搞出来了。
原帖子在这里:
解决问题的关键,指针数组,包括函数指针数组,里面的元素存放的是指针,所以得出来的是一个地址,也就是指针变量,那么怎么使用呢?答案就是找一个“指向指针的指针”,也就是找一个二重指针来解决问题,普通教科书上说的例子(谭浩强的C语言)用的是 int ,那么其实函数指针同样有效。于是结果就出来了。
原理不懂的时候搞了3个多小时,原理懂的时候就10分钟 ....XD
#include <stdio.h>
void (*_Key_Deal_A[4])(int); // 函数的功能是单纯的打印输出
void key_deal_a0(int a) { printf("\n_Key_Deal_A : key_deal_a0"); printf("\nparam : %d",a); } void key_deal_a1(int a) { printf("\n_Key_Deal_B : key_deal_b0"); printf("\nparam : %d",a); } void key_deal_a2(int a) {} void key_deal_a3(int a) {}
void (*_Key_Deal_B[3])(void); void key_deal_b0(void) { printf("\n_Key_Deal_B : key_deal_b0"); } void key_deal_b1(void) {} void key_deal_b2(void) {}
void Init_Touch() //初始化函数指针数组,在系统初始化时调用
{ _Key_Deal_A[0]=key_deal_a0; _Key_Deal_A[1]=key_deal_a1; _Key_Deal_A[2]=key_deal_a2; _Key_Deal_A[3]=key_deal_a3; _Key_Deal_B[0]=key_deal_b0; _Key_Deal_B[1]=key_deal_b1; _Key_Deal_B[2]=key_deal_b2; }
int main(int argc,char **argv) { int i; void *Key_Deal_Tab[10]={(void*)&_Key_Deal_A,(void*)&_Key_Deal_B}; void (**p)(int); void (**q)(void);
Init_Touch(); p = Key_Deal_Tab[0]; q = Key_Deal_Tab[1]; // 遍历 deal a 中所有函数
for (i=0;i<4;i++) (**(p+i))(20); // 遍历 deal b 中所有函数
for (i=0;i<3;i++) (**(q+i))();
return 0; }
|
阅读(2116) | 评论(0) | 转发(1) |