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

辧聪 2011-11-10 08:46:35
#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点我对函数指针数组有一定认识.但这个我真的不太清楚了。
求一个高手一步步分析。



...全文
147 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
辧聪 2011-11-11
  • 打赏
  • 举报
回复
门前冷落啊??
pathuang68 2011-11-11
  • 打赏
  • 举报
回复
1. 函数指针和普通指针是不同的
2. 函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。
3. 根据2,a函数的类型和其他函数的类型是不一样的。因此,不能把不同类型的数据放在同一个数组里面,因此,数组op那样初始化是错的。
4. int *op[5]这种方式,并不适合用于声明函数指针数组。

楼主可以参考:
函数指针的几种用法
辧聪 2011-11-10
  • 打赏
  • 举报
回复
1 #include <stdio.h>
2
3 void a(int page);
4 void b(void);
5 void c(void);
6 void d(void);
7 void *op[5] = { // int *op[5]
8 (void *) a,
9 (void *) a,
10 (void *) b,
11 (void *) c,
12 (void *) d
13 };
14
15 void a(int page)//page==0 or 1
16 {
17 if (page == 0)
18 printf("A\n");
19 else
20 printf("a\n");
21 }
22
23 void b(void)
24 {
25 printf("b\n");
26 }
27
28 void c(void)
29 {
30 printf("c\n");
31 }
32
33 void d(void)
34 {
35 printf("d\n");
36 }
37
38 int main()
39 {
40 int j = 1;

37
38 int main()
39 {
40 int j = 1;
41 void (*f) ();
42 for(j=0;j<5;j++)
43 {
44 f = (void *) op[j];
45 (*f) (j);
46 }
47
48 }

hecong@hecong-VirtualBox:~$ vim aa.c
hecong@hecong-VirtualBox:~$ gcc aa.c
hecong@hecong-VirtualBox:~$ ./a.out
A
a
b
c
d
为了验证这玩意,我
刚开了我的linux跑 ,无警告,运行正常!
可能我对void 与 int 也需要多找找资料
1,1
辧聪 2011-11-10
  • 打赏
  • 举报
回复
getchar()是我的程序运行一闪而过,人为停顿用的
其他是没有问题的 f=(void *)op[j]; /*这个依然有警告,相当于把一个函数的入口地址赋给f*/ 我的现在的纯编辑器要加(void *)才无警告 。本来这句(void *)也没

等高手!求推荐精!让高手们整整!
solo7773 2011-11-10
  • 打赏
  • 举报
回复
我也菜,等高手来解答
solo7773 2011-11-10
  • 打赏
  • 举报
回复
#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(); /*这个不明白是什么意思*/
}

建议你把你的这个程序由来说清楚
辧聪 2011-11-10
  • 打赏
  • 举报
回复
dev C++
keil编译都烧到板子上跑的
nxp编译也无任何警告
辧聪 2011-11-10
  • 打赏
  • 举报
回复
第一点 int *op[5] int (*op)[5]
代码是从10多年嵌入式高级工程师上拿的.我把
它简化了,但结构一点没改.3000多行代码也没任何警告.
solo7773 2011-11-10
  • 打赏
  • 举报
回复
晕,第一点说错了,前面半句错了,你是对的
如果是这样的话,我后面几点说的能解释你的部分疑问,我也还在看,不是很懂
solo7773 2011-11-10
  • 打赏
  • 举报
回复
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下面一大堆的警告,这到底是你自己写的还是书上的
辧聪 2011-11-10
  • 打赏
  • 举报
回复
这个我懂啊,也会写。问题是f(0)值A f(1)值a,调的是同1个函数 其他才b,c,d
而且我想就我上面的程序到底怎么实现的。因为我感觉它直接数组指针=函数+函数
goldbeef 2011-11-10
  • 打赏
  • 举报
回复
#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();
}
楼主明白了吧

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧