经典精炼函数指针数组的求解
#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下面一大堆的警告,这到底是你自己写的还是书上的
[解决办法]
晕,第一点说错了,前面半句错了,你是对的
如果是这样的话,我后面几点说的能解释你的部分疑问,我也还在看,不是很懂
[解决办法]
#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]这种方式,并不适合用于声明函数指针数组。
楼主可以参考:
函数指针的几种用法