回調函數(Language C)

#源于指針的深入學習

對于回調函數,其實我們只需要了解一下函數指針即可使用回調函數了

什么是回調函數?

通俗的來講,它是一個函數指針變量(注意:它不是指針函數,它們是不同的一個概念)

函數指針---指針存儲著一個函數的地址

指針函數---該函數的返回值是指針類型

為何要使用函數指針?

其實在企業級項目開發中,開發為了避免代碼壅余,以及封裝細節,多重調用,日常維護中減輕運維的所需要的時間金錢成本;從而大量的使用回調函數作為別的函數的參數---怎么創建出這個神奇的回調函數呢?也就是我們說的函數指針。

怎么創建函數指針&如何使用?

首先,我們需要知道,指針存儲地址時,往往獲取變量的首地址。那么該如何獲得函數的首地址呢

  1. 函數名---其實就是地址
  2. 函數名就是該函數所占內存的首地址

那么我們就可以直接把函數地址以函數名的方式存儲在指針中

寫法:

函數返回類型(*變量名)(參數類型與個數) = 我們想要的那個函數的函數名

例如:

1.無返回類型且無參數的函數指針創建.

void printstr(){printf("Hello,World");
}void (*p)() = printstr;/*分析:在此處,我定義的函數printstr并無返回值
所以函數指針的創建時,它也是void; 并且該函數并未
有接收的參數;所以p變量旁邊的()也是空的*/

?2.有返回值且有參數的函數指針創建.

int better(int a,int b):return (a > b) ? 1 : 0 
//此為三目運算 如果a > b 成立則返回 1 否則為 0//創建函數指針
int (*c)(int,int) = better/*注意,此處函數指針前面的返回類型 是與函數一致的
參數個數與原函數(better)一致,唯一不同的是,我們只需要
寫出參數的類型,無需具體的參數名

又如這個:

#include <stdio.h>
void f1() {printf("hello,world");
}int main() {void (*p)(); //定義函數指針 p = f1; //函數名就是首地址--->傳地址了p(); //通過函數指針調用函數 等價于 f1()int (*a)(int, int) = add;//告訴有幾個形參,類型printf("%d\n", a(1, 2));return 0;
}

那么,我們進階的來體驗一下什么是回調函數

#include <stdio.h>int less(int x,int y){return ( x < y ) ? 1 : 0;
}int greater(int x, int y) {return ( x > y ) ? 1 : 0;
}//回調函數:把函數名作為另一個函數的參數
//作用修改:修改函數的功能void sort(int *a,int len,int (*p)(int,int)) {int i,j;for (i = 0; i < len - 1; i++) {for ( j = 0; j < len - i - 1; j++) {//if (a[j] > a[j+1]) { 原先的判別if (p(a[j],a[j+1])) { //通過函數指針調用函數int num = a[j];a[j] = a[j+1];a[j + 1] = num;}}}}int main() {int a[10] = {0}; //創建整數數組
/*其實在使用中,指針與數組是相同的,所以我們在參數設置的為指針
傳入的時候可以用 數組名 int i;for ( i = 0; i < 10; i++) {scanf("%d",a[i]);}sort(a,10,greater); //只需要修改這里傳入的函數for ( i = 0; i < 10; i++) {printf("%d",a[i]);}
//打印出排序后的數組printf("\n");return 0;
}

請觀看的時候,一個個的實現一下,會對我們的理解更有幫助

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697223.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

靡語IT:JavaScript_概述、基礎

一、JavaScript 概述 javaScript 語言主要是完成頁面的數據驗證&#xff0c;因此它運行在客戶端&#xff0c; 需要運行瀏覽器來解析執行 JavaScript 代碼。js 是網景公司 &#xff08;Netscape&#xff09;的產品&#xff0c;最早取名為 LiveScript 最后借 java 的熱度 改為 j…

C++多線程同步(上)

多線程同步 引言總述詳情互斥鎖示例運行結果分析條件變量示例一實現分析優化運行結果示例二實現代碼運行結果示例三實現代碼運行結果讀寫鎖示例實現代碼注意分析運行結果附言實現運行結果運行結果個人心得引言 項目中使用多線程,會遇到兩種問題,一種是對共享資源的訪問時需要…

關于運行flutter app 運行到模擬器出現異常提示

Exception: Gradle task assembleDebug failed with exit code 1 解決方案&#xff1a; 1.講當前文件的distributionUrl值改為 https://mirrors.cloud.tencent.com/gradle/gradle-7.4-all.zip

Redis 學習筆記 3:黑馬點評

Redis 學習筆記 3&#xff1a;黑馬點評 準備工作 需要先導入項目相關資源&#xff1a; 數據庫文件 hmdp.sql后端代碼 hm-dianping.zip包括前端代碼的 Nginx 啟動后端代碼和 Nginx。 短信登錄 發送驗證碼 PostMapping("code") public Result sendCode(RequestP…

超市售貨|超市售貨管理小程序|基于微信小程序的超市售貨管理系統設計與實現(源碼+數據庫+文檔)

超市售貨管理小程序目錄 目錄 基于微信小程序的超市售貨管理系統設計與實現 一、前言 二、系統功能設計 三、系統實現 1、微信小程序前臺 2、管理員后臺 &#xff08;1&#xff09;商品管理 &#xff08;2&#xff09;出入庫管理 &#xff08;3&#xff09;公告管理 …

CrossOver2024虛擬機軟件的優缺點分別是什么?

CrossOver虛擬機軟件的優缺點分別如下&#xff1a; 優點&#xff1a; 無需雙系統&#xff1a;用戶可以在Mac或Linux系統上直接運行Windows應用程序&#xff0c;無需安裝雙系統&#xff0c;從而節省了硬盤空間并避免了系統切換的麻煩。易于安裝和使用&#xff1a;CrossOver具有…

文件上傳---->生僻字解析漏洞

現在的現實生活中&#xff0c;存在文件上傳的點&#xff0c;基本上都是白名單判斷&#xff08;很少黑名單了&#xff09; 對于白名單&#xff0c;我們有截斷&#xff0c;圖片馬&#xff0c;二次渲染&#xff0c;服務器解析漏洞這些&#xff0c;于是今天我就來補充一種在upload…

RAW 編程接口 TCP 簡介

一、LWIP 中 中 RAW API 編程接口中與 TCP 相關的函數 二、LWIP TCP RAW API 函數 三、LwIP_Periodic_Handle函數 LwIP_Periodic_Handle 函數是一個必須被無限循環調用的 LwIP支持函數&#xff0c;一般在 main函數的無限循環中調用&#xff0c;主要功能是為 LwIP各個模塊提供…

web前端安全性——JSONP劫持

1、JSONP概念 JSONP(JSON with Padding)是JSON的一種“使用模式”&#xff0c;可用于解決主流瀏覽器的跨域數據訪問的問題。由于同源策略&#xff0c;協議IP端口有任意不同都會導致請求跨域&#xff0c;而HTML的script元素是一個例外。利用script元素的這個開放策略&#xff0…

vscode【報錯】yarn : 無法將“yarn”項識別為 cmdlet

問題 CMD下載完yarn可以查看到yarn版本&#xff0c;但是進入到vscode控制臺報錯無法識別&#xff0c;報錯內容如下&#xff1a; vscode【報錯】yarn : 無法將“yarn”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff…

@ 代碼隨想錄算法訓練營第8周(C語言)|Day57(動態規劃)

代碼隨想錄算法訓練營第8周&#xff08;C語言&#xff09;|Day57&#xff08;動態規劃&#xff09; Day53、動態規劃&#xff08;● 1143.最長公共子序列 ● 1035.不相交的線 ● 53. 最大子序和 動態規劃 &#xff09; 1143.最長公共子序列 題目描述 給定兩個字符串 text1 …

C#面:i++ 和 ++i 的區別

i 先參與左邊的運算&#xff0c;之后 i 自增&#xff1b; int i 5; int result i; // result的值為5&#xff0c;i的值變為6 i i 先自增&#xff0c;之后的值&#xff0c;參與左邊的運算&#xff1b; int i 5; int result i; // result的值為6&#xff0c;i的值也為6…

【一步步由簡入深,搞定FFT,持續更新中...】

作為一個傾向于形象思維的工程師&#xff0c;總想把復雜深奧的知識搞的方便理解&#xff0c;雖然上學時學過數字信號處理&#xff0c;仍然一知半解&#xff0c;現在想借著項目中涉及到的頻譜相關知識總結下來&#xff0c;在了解中逐步完善。 好了&#xff0c;首先要明確的概念是…

ffmpeg for android編譯全過程與遇到的問題

編譯前準備 編譯環境&#xff1a;Ubuntu16&#xff0c;可自行下載VMWare最新版并百度永久許可證或在服務器上安裝Ubuntu ffmpeg源碼&#xff1a;ffmpeg4.2.2 NDK下載&#xff1a;Android NDK r21e 有條件的最好還是在Liunx平臺下編譯吧&#xff0c;Windows平臺下編譯坑更多…

【計算機網絡】數據鏈路層|封裝成幀|透明傳輸|差錯檢測|PPP協議|CSMA/CD協議

目錄 一、思維導圖 ? 二、數據鏈路層功能概述 1.數據鏈路層概述 2.數據鏈路層功能概述——封裝成幀 3.數據鏈路層功能概述——透明傳輸 4.數據鏈路層功能概述——差錯檢測 三、數據鏈路層重要協議 1.數據鏈路層重要協議&#xff1a;PPP協議 2.數據鏈路層重要協議&#x…

js設計模式:備忘錄模式

作用: 封裝的對象可以在對象觸發行為時進行狀態的記錄與保存 也可以進行狀態的回退,恢復之前的狀態 示例: class Editor{constructor(){this.allText }edit(text){this.allText text}saveNow(){return new EditorText(this.allText)}backspacing(editorText){this.allText…

護眼臺燈哪個品牌更好用?五大好用護眼臺燈大爆料!

護眼臺燈相信大家都有所耳聞或者使用過,家里有小孩的可能了解更深,畢竟是孩子學習時需要使用的小家電。現在市面上的護眼臺燈種類可以說是多到眼花繚亂,甚至有些劣質的產品摻雜在里面,或許有些寶媽已經踩過一些坑了&#xff0c;護眼臺燈究竟哪個品牌更好用&#xff1f; &#x…

這個春節,爽了

四次醫院 請了一周假&#xff0c;準備開始愉快的長假。 結果第一天小孩就發燒了&#xff0c;趕緊送醫院拿藥。回到家才發現&#xff0c;給醫生看的驗血報告是上一次的&#xff0c;那是好幾個月之前的。 但是藥已經吃了&#xff0c;這是吃錯藥了呀&#xff01;&#xff01; …

手機中有哪些逆向進化的功能

手機中有哪些逆向進化的功能&#xff1f;逆向進化是指明明很優秀的很方便的功能&#xff0c;卻因為成本或者其他工業原因莫名其妙地給取消了。 逆向進化1&#xff1a;可拆卸電池-變為不可拆卸電池。 智能手機為了追求輕薄等原因&#xff0c;所以移除了可拆卸電池功能。將電池…

GoLand 相關

goland 下載依賴 go mod tidy&#xff1a;保持依賴整潔 go mod tidy 命令的作用是清理未使用的依賴&#xff0c;并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 兩個命令是維護項目依賴不可或缺的工具。go mod tidy 確保了項目的 go.mod 文件精簡且準確&…