函數指針的定義與使用


函數的本質

函數的本質是一段可執行性代碼段。函數名,則是指向這段代碼段的首地址。

#include <stdio.h> void print() { printf("china\n"); } void dis() { printf("china\n"); } int main() { void (*pf)() = print; //void (*pf)() = &print; //此兩種形式的的賦值方式都是沒有問題的。 pf(); //(*pf)(); pf = dis; pf(); return 0; }

1)上述代碼中函數void print()和void dis()他們都有一個公共的類型就是void (*)(void);

2)使用void (*)(void)類型定義了一個變量名為p的函數指針,並且對其賦值;

 

更簡潔的表示方式

當函數類型較為復雜時,我們往往使用typedef來定義一個簡潔的類型名稱使之更容易使用。

例如:typedef void (*PFUNC)();這時候我們就可以這樣去使用:

typedef void (*PFUNC)() ; int main() { PFUNC pf= print; pf(); pf = dis; pf(); return 0; }

 

應用場景

函數指針的一個用法出現在菜單驅動系統中。例如程序可以提示用戶輸入一個整數
值來選擇菜單中的一個選項。 用戶的選擇可以做函數指針數組的下標, 而數組中的
指針可以用來調用函數。

#include <stdio.h> void function0(int); void function1(int); void function2(int); int main() { void (*f[3])(int) = {function0,function1,function2}; //將這 3 個函數指針保存在數組 f 中 int choice; printf("Enter a number between 0 and 2, 3 to end: "); scanf("%d",&choice); while ((choice >= 0) && (choice <3)) { (f[choice])(choice);//(*f[choice])(choice);這種寫法亦可 //f[choice]選擇在數組中位置為 choice 的指針。 //指針被解除引用, 以調用函數, 並且 choice 作為實參傳遞給這個函數。 printf("Enter a number between 0 and 2,3 to end: "); scanf("%d",&choice); } printf("Program execution completed."); return 0; } void function0(int a) { printf("You entered %d so function0 was called\n",a); } void function1(int b) { printf("You entered %d so function1 was called\n",b); } void function2(int c) { printf("You entered %d so function2 was called\n",c); }

 

回調函數

#include <stdio.h> int callBackCompare(int a,int b) { return a<b?1:0; } void selectSort(int *p, int n,int(*pf)(int,int)) { for(int i=0; i<n-1 ;i ++) { for(int j=i+1; j<n; j++) { if(pf(p[i],p[j])) { p[i] = p[i]^p[j]; p[j] = p[i]^p[j]; p[i] = p[i]^p[j]; } } } } int main(void) { int arr[10] = {6,5,4,3,2,1,7,8,9,0}; selectSort(arr,10,callBackCompare); for(int i=0; i<10; i++) { printf("%d\n",arr[i]); } return 0; }

回調函數本質
回調函數,本質也是一種函數調用,先將函數以指針的方式傳入,然后,調用。這種寫
法的好處是,對外提供函數類型,而不是函數定義。這樣我們只需要依據函數類型
和函數功能提供函數就可以了。給程序的書寫帶來了很大的自由。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM