经典精炼函数指针数组的求解解决思路

经典精炼函数指针数组的求解
#include <stdio.h>
void a(int page);
void b(void);
void c(void);  
void d(void);

int *op[5]={
(void *)a,
  (void *)a,
(void *)b,
(void *)c,
(void *)d
  };
void a(int page)
{if (page == 0) printf("A\n");
 else printf("a\n"); }
void b(void) {printf("b\n");}
void c(void) {printf("c\n");}
void d(void ) {printf("d\n");}

int main()
{  
int j=1;
  void (*f)();
  f=(void *)op[j];
  (*f)(j);
  getchar();
}

如以上程序问题1:int *op[5] 我作了其他变换 **op op[][] 等都不可以
而且我用 int (*op[5])() 也报错
问题2 int *op[5]到底是什么,好像不是函数指针数组
问题3 main里 为什么可以这么赋值并调用 j=0 A j=1,a 其他b, c, 
f(j)这里 j这么可以传进去? 其定义式void (*f)()里面没参数.
问题4:int *op[5]={(void *) 前面是int 后面是 void 怎么没警告。其后(void *)没加也报错警告
 第5点我对函数指针数组有一定认识.但这个我真的不太清楚了。
求一个高手一步步分析。





------解决方案--------------------
#include <stdio.h>

typedef void (*Func)();//顶一个指向函数(该函数返回为void,且参数列表为空)的指针类型,

void a(void);
void b(void);
void c(void);
void d(void);

Func op[4]={a,b,c,d};//定义一个函数指针数组

void a(void)
{

printf("A\n");

 }

void b(void)
{
printf("b\n");
}

void c(void)
{
printf("c\n");
}
void d(void ) 
{
printf("d\n");
}

int main()
{
Func f;
int i;
for (i=0;i<4;i++)
{
f=op[i];
(*f)();
}
getchar();
}
楼主明白了吧
------解决方案--------------------
1、int *op[5]:你定义了一个整型指针op,但是这个指针op包含有5个元素的一位数组
int *(op[5]):定义一个数组,数组的每个元素都是指针
2、你的那个j在这个既指向了数组的元素,有作为函数的实参了
3、f=(void *)op[j]可以改写成f=op[j],貌似你确实调用了下标为j的元素(a,b,c,d函数的地址)
不过根据a[i]=*(a+i)我确实没理解到这个的意思,照理说应该向后面移动了一个5个元素的一维数组的长度
4、(*f)(j)就是函数调用了,因为你的f已经指向了一个函数的入口地址,就是相当于在调用那个函数,也就是你所谓的a,b,c,d
5、int *op[5]={(void *) 怎么会没警告,vc下面一大堆的警告,这到底是你自己写的还是书上的

------解决方案--------------------
晕,第一点说错了,前面半句错了,你是对的
如果是这样的话,我后面几点说的能解释你的部分疑问,我也还在看,不是很懂
------解决方案--------------------
C/C++ code
#include <stdio.h>
void a(int page);
void b(void);
void c(void);   
void d(void);

void *op[5]={  /*这个类型要一致吧?*/
(void *)a,  /*每个元素是一个入口地址*/
  (void *)a,    
(void *)b,    
(void *)c,    
(void *)d    
  };
void a(int page)
{if (page == 0) printf("A\n");
else printf("a\n"); }
void b(void) {printf("b\n");}
void c(void) {printf("c\n");}
void d(void ) {printf("d\n");}

int main()
{   
int j=1;
  void (*f)(int);  /*这个应该这么定义吧*/
  f=(void *)op[j];  /*这个依然有警告,相当于把一个函数的入口地址赋给f*/
  (*f)(j);  /*开始调用f指向的函数*/
  getchar();   /*这个不明白是什么意思*/
}

------解决方案--------------------
我也菜,等高手来解答
------解决方案--------------------
1. 函数指针和普通指针是不同的
2. 函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。
3. 根据2,a函数的类型和其他函数的类型是不一样的。因此,不能把不同类型的数据放在同一个数组里面,因此,数组op那样初始化是错的。
4. int *op[5]这种方式,并不适合用于声明函数指针数组。

楼主可以参考:
函数指针的几种用法