日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

發(fā)布時間:2023/12/10 pytorch 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

回調(diào)函數(shù)是非常重要的概念

文章目錄

    • 1 函數(shù)的類型
    • 2 函數(shù)指針
      • 2.1 函數(shù)指針的使用
      • 2.2 使用函數(shù)指針實現(xiàn)回調(diào)函數(shù)
    • 3 總結(jié)

1 函數(shù)的類型

跟以前學(xué)數(shù)組的時候是一樣的,C語言中的數(shù)組是有自己的類型的。函數(shù)也是有自己的類型的。

  • 函數(shù)的類型由返回值、參數(shù)的類型、參數(shù)的個數(shù)共同決定

比如函數(shù)int add(int i, int j); 的函數(shù)類型是int (int, int)

  • 在C語言中可以使用typedef為函數(shù)重命名,如下
typedef int f(int, int); // 定義f為函數(shù)類型int(int, int)typedef void p(int); // 定義p為函數(shù)類型void(int)

上面定義函數(shù)類型一會再后面寫具體的代碼就會明白。

2 函數(shù)指針

與數(shù)組指針很相似

  • 函數(shù)指針用于指向一個函數(shù)
  • 函數(shù)名執(zhí)行函數(shù)體的入口地址(這里與數(shù)組指針一樣,數(shù)組名代表數(shù)組的入口地址)
  • 可以通過函數(shù)的類型定義函數(shù)指針:FuncType* pointer(例如上面定義的f,那么f* p; p指向函數(shù)類型為f的函數(shù)。)
  • 也可以直接定義(這種我們見到的比較多):type (*pointer)(parameter list)

上面:

  • FuncType 是一種函數(shù)類型(例如int (int, int))
  • type是函數(shù)的返回類型
  • pointer是函數(shù)指針
  • parameter list 是函數(shù)的參數(shù)列表
  • 2.1 函數(shù)指針的使用

    下面代碼是演示定義函數(shù)類型與如何使用函數(shù)指針的代碼:

    • 36-1.c:
    #include <stdio.h>typedef int FUNC(int); //定義函數(shù)類型int t(int i){return i*i; }void f(){printf("Call f()....\n"); }int main(){FUNC* pt = t; //定義函數(shù)指針ptvoid(*pf)() = &f; //定義函數(shù)指針pfprintf("pf = %p\n", pf);printf("f = %p\n", f);printf("&f = %p\n", &f);pf(); //一般這么用(*pf)(); //一般不這么用f();int k = pt(3);printf("k = %d\n", k);return 0; }
    • 運行結(jié)果為:

    上面代碼比較簡單,我們注意兩點:

    • typedef int FUNC(int); //定義函數(shù)類型
    • FUNC* pt = t; //定義函數(shù)指針pt
    • void(*pf)() = &f; //定義函數(shù)指針pf
    • 函數(shù)名f代表函數(shù)的入口地址,&f代表函數(shù)的整個地址(類似于數(shù)組),所以在數(shù)值上f與&f是相等的。但是意義不一樣。
    • 函數(shù)指針的使用:pf(); 或者 (*pf)(); 一般像前者那么使用

    2.2 使用函數(shù)指針實現(xiàn)回調(diào)函數(shù)

    如何使用C語言直接跳轉(zhuǎn)到某個固定的地址開始執(zhí)行?(不是goto)

    使用回調(diào)函數(shù),回調(diào)函數(shù)是一種很重要的思想。那么什么是回調(diào)機制呢?

    • 回調(diào)機制原理:
  • 調(diào)用者不知道具體事件發(fā)生時需要調(diào)用哪一個具體的函數(shù) (是不是與C++中的多態(tài)很像,是的C++中的多態(tài)原理就是這樣)
  • 當(dāng)具體的事件發(fā)生的時候 調(diào)用者通過函數(shù)指針,調(diào)用具體的函數(shù)。(是不是很像C++中的虛函數(shù)指針)
  • 回調(diào)機制中的調(diào)用者和被調(diào)用者沒有依賴關(guān)系

    • 上面的理論,看起來并不是很容易讓人理解,下面直接上手寫代碼就知道什么是回調(diào)函數(shù)了。

    • 代碼 36-2.c

    #include <stdio.h>typedef int (Fruit)(int); //定義Fruit為int(int)類型的函數(shù) 參數(shù):吃多少克,返回值:獲得多少能量void Eat(Fruit* fruit, int n){ //函數(shù)指針fruit:指向吃什么水果的函數(shù) 參數(shù)n:吃多少克int ret = 0;printf("Eat...\n");ret = fruit(n); //獲得多少能量printf("Increase : %d\n", ret); }int Apple(int n){ //吃n克蘋果獲得ret克能量int ret = 0;int i = 0;for(i=0; i<n; i++){printf("Eat apple get energy : %d\n", 1);ret++;}return ret; }int Banana(int n){ //吃n克香蕉獲得ret克能量int ret = 0;int i =0;for(i=0; i<n; i++){printf("Eat banana get energy : %d\n",3);ret+=3;}return ret; }int Pear(int n){ //吃n克梨子獲得ret克能量int ret = 0;int i = 0;for(i=0; i<n; i++){printf("Eat pear get energy : %d\n",5);ret+=5;}return ret; } int main(){Eat(Apple, 5); //get 5 printf("\n");Eat(Banana, 2); // get 6printf("\n");Eat(Pear, 3); //get 15printf("\n");return 0; }
    • 上述代碼的意思是:吃水果獲得能量。但是吃什么水果,只有在程序運行起來之后才知道。
    • 所以吃這個動作Eat函數(shù)的參數(shù)無法指定吃哪種水果
    • 只能使用函數(shù)指針作為Eat函數(shù)的參數(shù),當(dāng)程序運行起來時根據(jù)傳進來的參數(shù)確定吃什么水果,以及獲得多少能量

    上述程序編譯運行結(jié)果為:

    分析:

    • 上面代碼主要的核心就在于函數(shù)指針的使用。一定要學(xué)會函數(shù)指針的定義使用。
    • 學(xué)會使用函數(shù)指針來實現(xiàn)回調(diào)函數(shù)

    3 總結(jié)

    • 學(xué)會定義函數(shù)類型
    • 學(xué)會使用函數(shù)類型定義函數(shù)指針
    • 學(xué)會使用函數(shù)指針實現(xiàn)回調(diào)機制

    總結(jié)

    以上是生活随笔為你收集整理的【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。