OpenEdv-开源电子网

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

指针函数

[复制链接]

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2019-3-22
在线时间
185 小时
发表于 2019-3-26 13:12:40 | 显示全部楼层 |阅读模式
请问下面两段之间是什么关系呢,查资料越看越糊涂了……谢谢大家!
typedef struct{
REGION_T region;
int (* dot)(int ,int ,COLOR_T /* c */);
int (* line)(int /* x0 */,int /* y0 */,int /* x1 */,int /* y1 */,COLOR_T c);
int (* rect)(RECT_T * /* r */);
int (* box)(BOX_T * /* b */ );
int (* set_cursor)(int /* x */,int /* y */);
int (* line_to)(int /* x */,int /* y */,COLOR_T /* c */);
int (* arrow)(int x,int y,int dir,COLOR_T c);
int (* processbar)(PROCESSBAR_T *);
int (* splitter)(SPLITTER_T *);
int (* check_box)(CHECK_BOX_T *);
int (* circle)(int x,int y,int r,int fill,COLOR_T c);
int (* scrollbar)(SCROLLBAR_T *);
int (* show_picture)(int x,int y,int width,int height,char * path);
int (* dialog)(const char * fmt,...);
}GUI_T;



static int dot(int x, int y, COLOR_T c);
static int line(int /* x0 */, int /* y0 */, int /* x1 */, int /* y1 */, COLOR_T);
static int rect(RECT_T *);
static int box(BOX_T *);
static int line_to(int /* x */, int /* y */, COLOR_T /* c */);
static int set_cursor(int /* x */, int /* y */);
static int draw_arrow(int x, int y, int dir, COLOR_T c);
static int processbar(PROCESSBAR_T *);
static int splitter(SPLITTER_T *);
static int check_box(CHECK_BOX_T *);
static int circle(int x, int y, int r, int fill, COLOR_T c);
static int scrollbar(SCROLLBAR_T *);
static int show_picture(int x,int y,int width,int height,char * path);


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

153

主题

310

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2019-3-26
在线时间
18 小时
发表于 2019-3-26 14:32:50 | 显示全部楼层
http://www.iis7.com/c/90/
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2019-3-22
在线时间
185 小时
 楼主| 发表于 2019-3-26 14:56:18 | 显示全部楼层

没出现问题,就是搞不明白三者之间的关系,再加上下面这一段
GUI_T gui = {
        .dot = dot,
        .line = line,
        .rect = rect,
        .box = box,
        .arrow = draw_arrow,
        .set_cursor = set_cursor,
        .line_to = line_to,
        .processbar = processbar,
        .splitter = splitter,
        .check_box = check_box,
        .circle = circle,
        .scrollbar = scrollbar,
        .show_picture = show_picture,
        .region.x0 = 0,
        .region.y0 = 0,
        .region.x1 = LCD_XSIZE,
        .region.y1 = LCD_YSIZE
};
回复 支持 反对

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17786
金钱
17786
注册时间
2018-3-3
在线时间
523 小时
发表于 2019-3-26 15:29:06 | 显示全部楼层
就是一个结构体内部有很多的函数指针   然后赋值就是将对应的函数的地址分配给函数指针
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
发表于 2019-3-26 15:29:11 | 显示全部楼层
本帖最后由 LevenC 于 2019-3-26 15:49 编辑

你发的两段代码,上面的一段是结构体,结构体内部定义的是函数指针变量;下面的一段就是普通的函数声明。至于三楼的代码,就是一个结构体变量赋值。没有你说的指针函数。


int (* dot)(int ,int ,COLOR_T c);  这个是函数指针变量;

static int dot(int x, int y, COLOR_T c);  这个是函数声明;

如果是  int* dot(int ,int ,COLOR_T c);  也是函数声明,声明了一个指针函数;
回复 支持 反对

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2019-1-29
在线时间
67 小时
发表于 2019-3-26 16:22:49 | 显示全部楼层
本帖最后由 ZHDX 于 2019-3-26 16:24 编辑

简单讲解一下吧

这是C语法问题, 比较容易把人搞糊涂.

一个函数指针, 实际上就是指针.

定义函数
int myadd(int a, int b){ return a+b; }
int mysub(int a, int b){ return a-b; }

然后定义一个指针得到函数地址:
void* funcptr   =   opmode==1 ? myadd : mysub ; //动态地址, 在编译时不确定

这样是可以输出这个函数地址的.
printf(" func addr 0x%p \r\n", funcptr);

但是如果你想执行这个函数呢?

int v=funcptr(55,22);

C语言就立刻编译失败了.   因为你没有告诉C语言这个  funcptr 指向的函数是什么规范.


于是,  设计C语言的人就这么搞了 :
int (*funcptr)(int,int) = opmode==1 ? myadd : mysub ;

这相当于定义一个指针变量, 用于指向函数, 同时有告诉编译器, 目标函数的规范是两个int参数和返回 int


这种定义方式可以不使用typedef,  比较随时随地.   就是这个定义方式很不直观
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2019-3-22
在线时间
185 小时
 楼主| 发表于 2019-3-27 08:58:12 | 显示全部楼层
ZHDX 发表于 2019-3-26 16:22
简单讲解一下吧

这是C语法问题, 比较容易把人搞糊涂.

谢谢啦
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2019-3-22
在线时间
185 小时
 楼主| 发表于 2019-3-27 08:58:41 | 显示全部楼层
LevenC 发表于 2019-3-26 15:29
你发的两段代码,上面的一段是结构体,结构体内部定义的是函数指针变量;下面的一段就是普通的函数声明。至 ...

谢谢
回复 支持 反对

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2019-3-27 10:33:38 | 显示全部楼层
建议你学习一下,回调函数。
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-3-4
在线时间
3 小时
发表于 2019-3-27 11:04:39 | 显示全部楼层
学习一些大神
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 03:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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