了解开发语言的朋友应该都会对回调函数有所了解,在很多的程序开发语言中都能看到回调的身影。很多场景下,当某个条件成立以后我们**代码执行某些指定的部分,这个时候可以考虑使用回调函数的方式,这样做思路更加的清晰,也能使代码结构的逻辑更加清晰,结构更加好。 那回调函数的到底是什么呢?它又是怎么实现的呢? 这是本次想要简单分析的一个主题。 但是在说回调函数之前,我觉得很有必要先说明一下 “函数指针” 这个概念,它是回调函数能够实现的重要基础。 1、函数指针学习过C语言的伙伴都知道,C语言中的灵魂 — 指针。可以毫不犹豫的说,要检验你对C语言的掌握程度,那指针绝对是最好的考察方式。指针的使用和变幻方式,真正的使用起来能让你眼花缭乱。 下面是常见的指针的定义: - int *ptr1;
- char *ptr2;
- struct std *ptr3; // 结构体指针
那函数指针到底是什么呢? 函数指针:函数指针是指向函数的指针变量。简单理解是指向函数名的指针变量。 函数指针既然是指向函数的,那么它就可以像函数一样,用于调用函数、传递参数等操作。函数指针的定义方式如下: - 函数返回值类型 (* 指针变量名) (函数参数列表);
- “函数返回值类型”:表示该指针变量可以指向具有什么返回值类型的函数;
- “函数参数列表”:表示该指针变量可以指向具有什么参数列表的函数。
- 举例如下:
- int (*func1)(void)
- int (*func2)(int,char,...)
- char (*func3)(int,char,...)
- ......
从上面的演示可以看到,函数指针的定义就是将一个函数中的 “函数名” 改成“(* 指针变量名)”的方式,从而实现了一个函数指针的定义。 但是这里需要注意的是:“(* 指针变量名)”两端的括号是必须要有的,如果缺少了这对括号,那么这个定义的方式就会变为指针函数。如下: - int *func1(void)
- int *func2(int,char,...)
- char *func3(int,char,...)
- ......
- 这种就不是函数指针了,而是指针函数。两者差别是很大的。
特别需要需要注意的一点是:指向函数的指针变量没有 ++ 和 -- 运算。 对于函数指针,一般为了方便使用,我们会选择另外的一种定义方式: typedef 函数返回值类型 (* 指针变量名) (函数参数列表);比如: - typedef int (*Fun1)(int,...);
- typedef int (*Fun2)(int, int,...);
- typedef void (*Fun3)(void);
- typedef void* (*Fun4)(void*);
- ......
|