OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4433|回复: 23

函数指针有点困惑,求大佬解释下,这条语句的,谢谢~~~

[复制链接]

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
发表于 2018-6-12 14:09:03 | 显示全部楼层 |阅读模式
3金钱
工程中定义了一个结构体,结构体中有函数指针;然后在工程中又定义了一个结构体数组,数组中有一些函数,为啥能通过这句话(*menuListTable[gIndexNow].function) ();就能进入数组中相应的函数中去,比如gIndexNow = 0;就调用了void  welcome()这个函数,等于1就是进入这个void  fastswitch()函数,这个gIndexNow寄存器等于多少,就进入相应数组对于的函数中去,(*menuListTable[gIndexNow].function) ()这个前面的*不是指向函数吗?
1.jpg
2.jpg
3.jpg

最佳答案

查看完整内容[请看2#楼]

这是函数指针的用法,函数指针是一个指针,它指向函数的地址。
我是小白,很白很白的小白!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-6-12 14:09:04 | 显示全部楼层
这是函数指针的用法,函数指针是一个指针,它指向函数的地址。
没有脑袋
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-6-12 14:35:36 | 显示全部楼层
menuListTable是MenuTypedef结构的数组。也就是menuListTable中的每一个数据都是MenuTypedef类型的,所以menuListTable【0】,menuListTable【1】.。。。。等等都是menuListTable类型的,menuListTable【0】.function就是welcome。
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-6-12 14:39:40 | 显示全部楼层
刚按了回车想换行的,结果直接回复了。
至于后面的*也不是很理解了我感觉不加*号就可以啊。。。。。直接menuListTable【0】.function()就好了呀,。。。帮顶
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2018-6-12 15:18:57 | 显示全部楼层
图3 里不是声明函数指针,是调用函数,其中“ * ”的含义是指针的解引用。其实这里也可以省略,和定义函数指针时一个道理,函数名就可以代表入口地址,&fun和fun也没啥区别。可能作者想强调一下这是个指针?

另外,如果界面结构不准备动态的修改,menuListTable[]可以用const修饰,可以省一些内存
回复

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2018-6-12 15:47:50 | 显示全部楼层
结构体里, void (*function)();函数指针,指明了函数的调用方式为 (*function)();所以,最后那里,获取数组里的结构体变量的成员function之后(=menuListTable[gIndexNow].function),就是按照 (*function)()的形式调用。当然,我觉得不要指针符号也可以的。
回复

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2016-7-30
在线时间
82 小时
发表于 2018-6-12 16:33:11 | 显示全部楼层
本帖最后由 rmrmrm 于 2018-6-14 09:21 编辑

访问结构体类型的指针,要么指向-> ,要么*,没毛病更正 只有结构体类型指针或者共用体类型指针才能用->  结构体类型访问结构体里面的变量只能用.  
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-12 17:21:02 | 显示全部楼层
wangmingwei093 发表于 2018-6-12 14:35
menuListTable是MenuTypedef结构的数组。也就是menuListTable中的每一个数据都是MenuTypedef类型的,所以me ...

这个数组我知道对应相应的函数   只是不知道这个函数作用(*menuListTable[gIndexNow].function) ();现在知道啦 忘记这个是函数指针  获取函数入口地址的作用,所以数组中的寄存器是几就可以进入对应数组中的函数啦
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-12 17:22:14 | 显示全部楼层
本帖最后由 程功之道 于 2018-6-12 17:53 编辑
wangmingwei093 发表于 2018-6-12 14:39
刚按了回车想换行的,结果直接回复了。
至于后面的*也不是很理解了我感觉不加*号就可以啊。。。。。直接me ...

谢谢 刚刚设备才有设备  试了下  前面的*可以去掉 因为结构体中定义了函数指针
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-12 17:26:18 | 显示全部楼层
本帖最后由 程功之道 于 2018-6-12 17:54 编辑
xianshasaman 发表于 2018-6-12 15:18
图3 里不是声明函数指针,是调用函数,其中“ * ”的含义是指针的解引用。其实这里也可以省略,和定义函数 ...

嗯嗯,const这个知道  *这个是可以省略的  结构体中定义了函数指针
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-12 17:28:41 | 显示全部楼层
rmrmrm 发表于 2018-6-12 16:33
访问结构体里面的指针,要么指向-> ,要么*,没毛病

嗯嗯 刚注意到了挂号  没挂号是指针函数,有挂号是函数指针
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-12 17:29:47 | 显示全部楼层
林光华ing 发表于 2018-6-12 15:47
结构体里, void (*function)();函数指针,指明了函数的调用方式为 (*function)();所以,最后那里,获取数 ...

没这个就不是函数指针啦
我是小白,很白很白的小白!!!
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-6-13 09:16:24 | 显示全部楼层
跟那个傻孩子菜单结构体很像啊
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-13 09:25:44 | 显示全部楼层
a3748622 发表于 2018-6-13 09:16
跟那个傻孩子菜单结构体很像啊

???
我是小白,很白很白的小白!!!
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-6-13 11:01:59 | 显示全部楼层

你这段代码是菜单结构体吧

貌似看到很多这种类似的菜单结构体
是参考哪个“傻孩子菜单结构”的。
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-13 11:29:39 | 显示全部楼层
a3748622 发表于 2018-6-13 11:01
你这段代码是菜单结构体吧

貌似看到很多这种类似的菜单结构体

  傻孩纸?我要笑了   
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-13 11:30:49 | 显示全部楼层
a3748622 发表于 2018-6-13 11:01
你这段代码是菜单结构体吧

貌似看到很多这种类似的菜单结构体

来来来  你写个更好的
我是小白,很白很白的小白!!!
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-6-13 14:54:22 | 显示全部楼层
程功之道 发表于 2018-6-13 11:30
来来来  你写个更好的

你怎么了

“傻孩子菜单结构”本来就是一个名字,别人喜欢这么起我们管不着吧

还有,我真的就参考他的自己写了一个菜单结构。
采用消息处理->画面显示的模式,用在旋转编码器按键上。
他这个结构有个不好的地方就是需要创建太多的结构体成员,
很占用空间的。
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-14 09:07:12 | 显示全部楼层
a3748622 发表于 2018-6-13 14:54
你怎么了

“傻孩子菜单结构”本来就是一个名字,别人喜欢这么起我们管不着吧

如果不这样做 你试试不用结构体看看 占的空间更大 而且这个好处就是可以无限级,在空间足够的情况下
我是小白,很白很白的小白!!!
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-6-14 09:32:42 | 显示全部楼层
程功之道 发表于 2018-6-14 09:07
如果不这样做 你试试不用结构体看看 占的空间更大 而且这个好处就是可以无限级,在空间足够的情况下

结构 != 结构体

菜单结构能支持多级深度这是起码的需求。
看了你贴出来的代码,是一个结构体成员表示一个菜单画面。

之前我参照“傻孩子菜单结构”也是这么做的。
后来觉得这样做的话,当画面多了就很占用空间。
所以改了逻辑结构,使用按键改动标志位的值,根据标志位显示不同画面

用这种方式,根据深度不同只需要几个结构体成员就够了。
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-6-14 09:35:13 | 显示全部楼层
程功之道 发表于 2018-6-14 09:07
如果不这样做 你试试不用结构体看看 占的空间更大 而且这个好处就是可以无限级,在空间足够的情况下

你结构体里面的成员,如果不需要改动它们的数值
可以考虑加个“const”,节省ram
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-14 10:59:12 | 显示全部楼层
a3748622 发表于 2018-6-14 09:35
你结构体里面的成员,如果不需要改动它们的数值
可以考虑加个“const”,节省ram

嗯嗯  知道  code和const一样的道理
我是小白,很白很白的小白!!!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4893
金钱
4893
注册时间
2017-7-6
在线时间
719 小时
 楼主| 发表于 2018-6-14 11:02:00 | 显示全部楼层
a3748622 发表于 2018-6-14 09:32
结构 != 结构体

菜单结构能支持多级深度这是起码的需求。

一个寄存器标志位,菜单界面那么多,有时候你会把自己转晕,还不如建个结构体数组方便,上下按键 确认按键  返回按键 该怎么进入其他函数就怎么进入,如果你用标志位的话 那就呵呵啦  多了你会绕晕自己
我是小白,很白很白的小白!!!
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-6-14 13:57:14 | 显示全部楼层
程功之道 发表于 2018-6-14 11:02
一个寄存器标志位,菜单界面那么多,有时候你会把自己转晕,还不如建个结构体数组方便,上下按键 确认按 ...

嗯,各有所爱。
你感到够用就行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表