定義:指向函數的指針,可以通過函數指針調用指向的函數
指針類型必須與指向的數據類型一致, 函數有:返回值 函數名名 參數列表
函數指針聲明: 返回值類型 (*函數指針名) (參數列表)= 函數名
函數名和數組名一樣都是地址
// 例1: int (*p)(int a, int b) = sumValue; // sumValue是簡單的兩個數求和函數 // 在*後面寫變量名 一定要加括號 printf("%d\n", p(5, 8)); // 結果是:5+8=13 // 例2. 定義一個函數打印“Hello” void (*p) ()= printHello; // 前面是void 這個只是單純的定義 p(); // 函數指針調用 // 例3. 定義兩個函數,一個求最⼤值,一個求和,輸⼊max或sum分別求3,5的最大值或和 char input[] = {0}; scanf("%s", input); int (*p) (int a, int b) = NULL; if (strcmp("sumValue", input) == 0) { p = sumValue; } else if(strcmp("maxValue", input) == 0) p = maxValue; printf("%d ",p(3, 5)); // 結果是對的 你們可以自己測試一下
回調函數過程:有點類似函數嵌套,但是回調函數的形參值是函數指針,通過函數指針,調用對應的函數,之後再返回函數指針的地方
例: 寫一個函數查找90分以上的學員,使用回調函數在姓名後面加“高富帥”
Student.h:
#import <Foundation/Foundation.h> typedef struct student{ char name[10]; float score; }Student; void search(Student *stu, void (*p) (Student *s)); void addString(Student *s);
Student.m:#import "Student.h" void search(Student *stu, void (*p) (Student *)){ if (stu->score >= 90) { p(stu); } } void addString(Student *s){ strcat(s->name, "高富帥"); }
main.m :int main(){ Student stu[3] = {{"zheng", 89}, {"chen", 91}, {"fang", 94}}; for (int i = 0; i < 3; i++) { search(stu+ i, addString); printf("%s %.1f\n", stu[i].name, stu[i].score); } return 0; }
結果打印:zheng 89.0 chen高富帥 91.0 fang高富帥 94.0 Program ended with exit code: 0
#import <Foundation/Foundation.h> typedef struct student{ char name[20]; int age; float score; }Student; #pragma mark---------------普通的冒泡排序 START-------------------- // 學生姓名升序-------------------------------- void sortOfName(Student *stu, int count){ for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - 1 - i; j++) { if (strcmp(stu[j].name, stu[j + 1].name) > 0) { Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } for (int i = 0; i < count; i++) { printf("%s, %d, %.1f\n", stu[i].name, stu[i].age, stu[i].score); } } // 年齡降序------------------------------ void sortOfAge(Student *stu, int count){ for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - 1 - i; j++) { if (stu[j].age < stu[j + 1].age) { Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } for (int i = 0; i < count; i++) { printf("%s, %d, %.1f\n", stu[i].name, stu[i].age, stu[i].score); } } // 成績升序--------------------------------- void sortOfScore(Student *stu, int count){ for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - 1 - i; j++) { if (stu[j].score > stu[j + 1].score) { Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } for (int i = 0; i < count; i++) { printf("%s, %d, %.1f\n", stu[i].name, stu[i].age, stu[i].score); } } //--------------------------------END-------------------------------- #pragma mark-------------------動態排序 START--------------------------- //兩個年齡比較大小,升序 BOOL compareAge(Student *s1, Student *s2){ return s1->age > s2->age; } //兩個分數比較大小,降序 BOOL compareScore(Student *s1, Student *s2){ return s1->score < s2->score; } //兩個姓名升序排序 BOOL compareName(Student *s1, Student *s2){ return strcmp(s1->name, s2->name) > 0; } //兩個年齡比較大小,降序 BOOL compareAge2(Student *s1, Student *s2){ return s1->age < s2->age; } typedef BOOL (*PFUN) (Student *, Student *); // PFUN = BOOL (*) (Student, Student) // 為函數指針類型起名為PFUN void sortStudent(Student stus[], int count, PFUN pfun){ // 這個pfun就可以指向你自己封裝的各種排序方法 for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - 1 - i; j++) { if (pfun(stus + j, stus + j + 1) == YES) { // 這裡調用你寫的排序方法 Student temp = stus[j]; stus[j] = stus[j + 1]; stus[j + 1] = temp; } } } for (int i = 0; i < count; i++) { printf("%s, %d, %.1f\n", stus[i].name, stus[i].age, stus[i].score); } } int main() { Student stu[5] = { {"zhang", 23, 78}, {"zhao", 11, 89}, {"bala", 22, 78.5}, {"mouse", 7, 89}, {"cat", 4, 100} }; // sortOfName(stu, 5); // sortOfAge(stu, 5); // sortOfScore(stu, 5); PFUN p = compareAge2; sortStudent(stu, 5, p); //-----------------------------------END-------------------------- return 0; }
代碼實現的功能:輸入maxValue,minValue, addValue,subtractValue任意一個字符串,會實現相應代碼的功能:
#import <Foundation/Foundation.h> // 四個實現取最大值,最小值,和,差的函數 int maxValue(int a, int b){ return a > b ? a : b; } int minValue(int a, int b){ return a < b ? a : b; } int addValue(int a, int b){ return a + b; } int subtractValue(int a, int b){ return a - b; } typedef int (*PFUN) (int, int); // 函數指針PFUN typedef struct functionp{ // 結構體,成員為:name:用來存儲對應函數的名字, func:存儲對應函數的地址 char name[20]; PFUN func; // 函數指針 }Functionp; PFUN getFunctionByName(Functionp func[], int count, char funName[]){ // 形參結構體數組func[count], 功能字符串 for (int i = 0; i < count; i++) { if (strcmp(funName, func[i].name) == 0) { // 找到對應結構體中的功能函數指針 return func[i].func; } } return NULL; } int main() { Functionp f[4] = { {"maxValue", maxValue}, //功能字符串和函數指針 {"minValue", minValue}, {"addValue", addValue}, {"subtractValue", subtractValue} }; while (1) { char name[30] = {0}; // 需要輸入的功能字符串 printf("輸入功能字符串:\n"); scanf("%s", name); getchar(); PFUN fun1 = NULL; // 一個空的函數指針 fun1 = getFunctionByName(f, 4, name); if (fun1 == NULL) { printf("please input again\n"); } else printf("%s = %d \n", name, fun1(3, 5)); } return 0; }
結果顯示:
輸入功能字符串:
maxValue
maxValue = 5
輸入功能字符串:
addValue
addValue = 8
輸入功能字符串:
subtractValue
subtractValue = -2
輸入功能字符串: