#源于指針的深入學習
對于回調函數,其實我們只需要了解一下函數指針即可使用回調函數了
什么是回調函數?
通俗的來講,它是一個函數指針變量(注意:它不是指針函數,它們是不同的一個概念)
函數指針---指針存儲著一個函數的地址
指針函數---該函數的返回值是指針類型
為何要使用函數指針?
其實在企業級項目開發中,開發為了避免代碼壅余,以及封裝細節,多重調用,日常維護中減輕運維的所需要的時間金錢成本;從而大量的使用回調函數作為別的函數的參數---怎么創建出這個神奇的回調函數呢?也就是我們說的函數指針。
怎么創建函數指針&如何使用?
首先,我們需要知道,指針存儲地址時,往往獲取變量的首地址。那么該如何獲得函數的首地址呢
- 函數名---其實就是地址
- 函數名就是該函數所占內存的首地址
那么我們就可以直接把函數地址以函數名的方式存儲在指針中
寫法:
函數返回類型(*變量名)(參數類型與個數) = 我們想要的那個函數的函數名
例如:
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;
}
請觀看的時候,一個個的實現一下,會對我們的理解更有幫助