一江春水向東流

          做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks
          ?回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給
          調用者從而實現調用。回調函數使用是必要的,在我們想通過一個統一接口實現不
          同的內容,這時用回掉函數非常合適。比如,我們為幾個不同的設備分別寫了不同
          的顯示函數:void TVshow(); void ComputerShow(); void NoteBookShow()...等
          等。這是我們想用一個統一的顯示函數,我們這時就可以用回掉函數了。void sho
          w(void (*ptr)()); 使用時根據所傳入的參數不同而調用不同的回調函數。
          ??????不同的編程語言可能有不同的語法,下面舉一個c語言中回調函數的例子,
          其中一個回調函數不帶參數,另一個回調函數帶參數。
          ??????例子1:
          //Test.c
          #include <stdlib.h>
          #include <stdio.h>
          int Test1()
          {
          ??int i;
          ??for (i=0; i<30; i++)
          ??{
          ????printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));

          ??}
          ??return 0;
          }
          int Test2(int num)
          {
          ??int i;
          ??for (i=0; i<num; i++)
          ??{
          ???printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));

          ??}
          ??return 0;
          }
          void Caller1(void (*ptr)())//指向函數的指針作函數參數
          {
          ??(*ptr)();
          }
          void Caller2(int n, int (*ptr)())//指向函數的指針作函數參數,這里第一個參數是為指向函數的指針服務的,
          { ??????????????????????????????????????????????//不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯誤。
          ??(*ptr)(n);
          ??return;
          }
          int main()
          {
          ??printf("************************\n");
          ??Caller1(Test1); //相當于調用Test2();
          ??printf("&&&&&&************************\n");
          ??Caller2(30, Test2); //相當于調用Test2(30);
          ??return 0;
          }
          ??????以上通過將回調函數的地址傳給調用者從而實現調用,但是需要注意的是帶
          參回調函數的用法。要實現回調,必須首先定義函數指針。函數指針的定義這里稍
          微提一下。比如:
          ????int (*ptr)(); 這里ptr是一個函數指針,其中(*ptr)的括號不能省略,因為
          括號的優先級高于星號,那樣就成了一個返回類型為整型的函數聲明了
          posted on 2008-02-16 12:00 allic 閱讀(18273) 評論(15)  編輯  收藏 所屬分類: C/C++

          評論

          # re: 探討C語言中的回調函數 2012-04-20 10:35 suiyuan0631
          good  回復  更多評論
            

          # re: 探討C語言中的回調函數 2012-04-20 10:36 suiyuan0631
          看了那么多個例子,就這個能讓我看明白什么是回調函數了!非常感謝  回復  更多評論
            

          # re: 探討C語言中的回調函數 2012-07-10 15:36 Karl
          同意樓上,這個最簡單易懂。。窘  回復  更多評論
            

          # re: 探討C語言中的回調函數[未登錄] 2013-01-07 17:05 adley
          void Caller1(void (*ptr)())//指向函數的指針作函數參數
          void (*ptr)() 里面應該是int型吧  回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-03-19 21:40 fuyy
           Caller1(Test1); //相當于調用Test2();
          這塊是不是應該是Test1()啊?  回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-05-09 14:40 游客
          void Caller2(int n, int (*ptr)())
          {
          (*ptr)(n);
          return;
          }

          調用ptr函數指針時候,傳了實參n ,但定義的時候形參是空的。
          應該是void Caller2(int n, int (*ptr)(int)) 這樣吧  回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-06-14 14:44 桃源伢子
          沒看見有回調的特點,就只是間接調用方法而已
          通過調用Caller1(Test1);來間接調用Test1方法而已,只體現了函數指針的使用而已。
            回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-08-05 16:51 kg
          上面的代碼中存在兩處錯誤:
          1.
          void Caller1(void (*ptr)()); //此處被調用函數的返回值是void的類型的
          int Test1(); //這個函數的返回值是int型的
          Caller1(Test1); // 這里被調用函數的返回值卻是int型的
          //Caller1的聲明應該改為:void Caller1(int (*ptr)());

          2.
          void Caller2(int n, int (*ptr)());//這里被調用函數是沒有參數的
          int Test2(int n); //這個函數的參數是int型的
          Caller2(n, Test2); //這里調用了一個有參數的函數
          //Caller2的聲明應該改為:void Caller2(int, int (*ptr)(int));  回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-10-26 10:41 無葉蓮
          @fuyy
          恩恩 我覺得也是 應該是筆誤了吧  回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-12-12 18:11 多歲的
          @suiyuan0631
          但是運行不來啊  回復  更多評論
            

          # re: 探討C語言中的回調函數 2013-12-12 18:11 多歲的
          運行不出來  回復  更多評論
            

          # re: 探討C語言中的回調函數[未登錄] 2014-02-13 15:43 jack
          完整的caller2的函數應該是:
          void Caller2(int n , int (*ptr)(int))//指向函數的指針作函數參數,這里第一個參數是為指向函數的指針服務的
          { //不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯誤。
          (*ptr)(n);
          return;
          }   回復  更多評論
            

          # re: 探討C語言中的回調函數[未登錄] 2014-02-24 11:18 panpan
          講解比較清晰 盡管例子中有兩處函數指針的錯誤,還是有可取之處  回復  更多評論
            

          # re: 探討C語言中的回調函數 2014-08-12 09:45 zl
          我也覺得是這樣@游客
            回復  更多評論
            

          # re: 探討C語言中的回調函數 2015-02-17 15:20 re
          這個不是函數指針嗎,怎么成了回調函數  回復  更多評論
            

          主站蜘蛛池模板: 道真| 都匀市| 孟州市| 霍州市| 故城县| 株洲县| 楚雄市| 天祝| 天镇县| 蒙山县| 临朐县| 文昌市| 黑水县| 怀远县| 稷山县| 水城县| 彭水| 惠来县| 偃师市| 隆化县| 贡山| 武宁县| 海淀区| 林州市| 吉隆县| 连南| 溧阳市| 白银市| 阿鲁科尔沁旗| 莱州市| 黄梅县| 蓬安县| 哈密市| 稻城县| 长寿区| 涪陵区| 公安县| 临江市| 大同县| 石屏县| 南昌县|