现在的位置: 首页 > 综合 > 正文

每日学习 兜兜转转 8.11

2017年11月22日 ⁄ 综合 ⁄ 共 1980字 ⁄ 字号 评论关闭


学习博客上的各种杂知识 兜兜转载


C语言之回调函数

想要全面的了解一个概念,必须至少了解它的三点:它是什么、它有什么用、它在什么时候用


1、什么是回调函数?

回调函数:见名知意,首先肯定的一点是它是一个函数,修饰词回调指的是程序员自己定义一个函数并实现它的程序内容,然后把这个函数的指针作为参数传递给其他函数(如系统函数)中,由其他函数(如系统函数)在运行时调用所实现的函数。函数是程序员自己实现的,但却是由其他函数(如系统函数)在运行时通过参数传递的方式调用的,这就是回调函数。简单一句话就是:由别人的函数运行期间来回调你实现的函数。


回调函数该如何使用?

  1. int fun1(void)    
  2. {    
  3.     printf("hello world.\n");    
  4.     return 0;    
  5. }    
  6.     
  7. void callback(int (*Pfun)())    
  8. {    
  9.     Pfun();    
  10. }    
  11.     
  12. int     
  13. main(void)    
  14. {    
  15.     callback(fun1);    
  16. }  

callback回调定义的函数fun1,传递给callback的是函数fun1的地址


  1. int fun2(char *s)  
  2. {  
  3.     printf("%s.\n", s);  
  4.     return 0;  
  5. }  
  6. void callback(int (*Pfun)(char *), char *s)  
  7. {  
  8.     Pfun(s);  
  9. }  
  10.   
  11. int  
  12. main(void)  
  13. {  
  14.     callback(fun2, "hello world");  
  15.     return 0;  
  16. }  


3、回调函数在什么情况下使用?

如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

两者区别:


        区别一

        for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。

        while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。

        区别二

        同样的代码,编译出的程序代码大小不同。


static

(一)

        当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标示符的链接属性,从externl改为internal。

      (二)

        当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。

用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。

main.c源码

  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. void main(void)  
  5. {  
  6.     fun();          /*fun函数就是在test.c文件中声明的函数*/  
  7.     printf("j = %d\n", j);/*j变量也是在test.c文件中声明的变量*/  
  8. }  

test.c源码

派生到我的代码片

  1. #include <stdio.h>  
  2.   
  3. static int i = 1;/*声明为内部变量,只能用于test.c源文件*/  
  4. int j = 2;/*可以作为外部变量使用,在main文件中用到了*/  
  5.   
  6. static void fun1(void)/*声明为内部函数,只能用在test.c源文件中*/  
  7. {  
  8.     printf("i+1 = %d, j+1 = %d\n", i+1, j+1);  
  9. }  
  10.   
  11. void fun(void)/*可以用在其他文件中,用在main文件中*/  
  12. {  
  13.     printf("i = %d, j = %d\n", i, j);  
  14.     fun1();  
  15. }  

test.h源码

  1. extern int j;  
  2. extern void fun(void);  

显示结果如下:

  1. i = 1, j = 2//该行是由main函数里调用的test.c文件中的fun函数生成的  
  2. i+1 = 2, j+1 = 3//该行是由test文件中fun函数调用的fun1函数生成的  
  3. j = 2//这是由main函数使用外部变量j直接生成的  




抱歉!评论已关闭.