学习博客上的各种杂知识 兜兜转载
想要全面的了解一个概念,必须至少了解它的三点:它是什么、它有什么用、它在什么时候用
1、什么是回调函数?
回调函数:见名知意,首先肯定的一点是它是一个函数,修饰词回调指的是程序员自己定义一个函数并实现它的程序内容,然后把这个函数的指针作为参数传递给其他函数(如系统函数)中,由其他函数(如系统函数)在运行时调用所实现的函数。函数是程序员自己实现的,但却是由其他函数(如系统函数)在运行时通过参数传递的方式调用的,这就是回调函数。简单一句话就是:由别人的函数运行期间来回调你实现的函数。
回调函数该如何使用?
- int fun1(void)
- {
- printf("hello world.\n");
- return 0;
- }
- void callback(int (*Pfun)())
- {
- Pfun();
- }
- int
- main(void)
- {
- callback(fun1);
- }
callback回调定义的函数fun1,传递给callback的是函数fun1的地址
- int fun2(char *s)
- {
- printf("%s.\n", s);
- return 0;
- }
- void callback(int (*Pfun)(char *), char *s)
- {
- Pfun(s);
- }
- int
- main(void)
- {
- callback(fun2, "hello world");
- return 0;
- }
3、回调函数在什么情况下使用?
如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
两者区别:
区别一
for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。
while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。
区别二
同样的代码,编译出的程序代码大小不同。
static
(一)
当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标示符的链接属性,从externl改为internal。
(二)
当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。
用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。
main.c源码
- #include <stdio.h>
- #include "test.h"
- void main(void)
- {
- fun(); /*fun函数就是在test.c文件中声明的函数*/
- printf("j = %d\n", j);/*j变量也是在test.c文件中声明的变量*/
- }
test.c源码
- #include <stdio.h>
- static int i = 1;/*声明为内部变量,只能用于test.c源文件*/
- int j = 2;/*可以作为外部变量使用,在main文件中用到了*/
- static void fun1(void)/*声明为内部函数,只能用在test.c源文件中*/
- {
- printf("i+1 = %d, j+1 = %d\n", i+1, j+1);
- }
- void fun(void)/*可以用在其他文件中,用在main文件中*/
- {
- printf("i = %d, j = %d\n", i, j);
- fun1();
- }
test.h源码
- extern int j;
- extern void fun(void);
显示结果如下:
- i = 1, j = 2//该行是由main函数里调用的test.c文件中的fun函数生成的
- i+1 = 2, j+1 = 3//该行是由test文件中fun函数调用的fun1函数生成的
- j = 2//这是由main函数使用外部变量j直接生成的