Chinaunix首页 | 论坛 | 博客
  • 博客访问: 594943
  • 博文数量: 99
  • 博客积分: 5128
  • 博客等级: 大校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-27 19:40
文章分类

全部博文(99)

文章存档

2012年(3)

2011年(5)

2010年(4)

2009年(31)

2008年(56)

分类: C/C++

2009-08-04 10:46:12

逛论坛看到一个问题,本来开始以为很简单,但是写出来的,编译通过,但是运行就是不通过,后来意识到问题的严重性,这里面肯定隐藏了自己不知道的东西,于是搞了一个早上,总算把结果搞出来了。
原帖子在这里:
 
解决问题的关键,指针数组,包括函数指针数组,里面的元素存放的是指针,所以得出来的是一个地址,也就是指针变量,那么怎么使用呢?答案就是找一个“指向指针的指针”,也就是找一个二重指针来解决问题,普通教科书上说的例子(谭浩强的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;
}

阅读(2076) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~