回调函数案列(C高级)
生活随笔
收集整理的這篇文章主要介紹了
回调函数案列(C高级)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
編譯器:vs2013
1.實質
其實回調就是一種利用函數指針進行函數調用的過程。 函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。
2.回調的思想
如果你有一個對數的操作,你現在還不知道是對它做加還是乘,還是別的什么運算。這個時候就可以定一個標準的函數框架,在調用的時候,將我要用的那個函數名作為參數傳入,則進行相應的操作。
3.c代碼
3.1 Callback01.c
打印任意類型的數組,先打印int類型,后打印自定義的結構體類型
#include <stdlib.h> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS //INT回調 void myPrintInt(void *data) {int *num = data;printf("%d\n", *num); }//void *arr萬能指針,eleSize類型大小 //void(*myPrint)(void * data) void printArray(void *arr, int eleSize, int len, void(*myFunc)(void * data)) {char *p = arr;for (int i = 0; i < len; i++){char *eleArr = p + i*eleSize;//數組每一層的地址//printf("%d\n", *(int *)eleArr);%d確定不了,用回調函數myFunc(eleArr);} } //打印數組 void test01() {int arr[5] = { 1, 2, 3, 4, 5 };int len = sizeof(arr) / sizeof(int);printArray(&arr, sizeof(int), len,myPrintInt); }//打印自定義結構體 struct Person {char name[64];int age; }; //結構體回調 void myPrintPerson(void *data) {struct Person *p = data;printf("name:%s age:%d\n", p->name, p->age); } void test02() {struct Person pArray[] = { { "aaa", 18 }, { "bbb", 19 }, { "ccc", 20 }, { "ddd", 21 } };int len = sizeof(pArray) / sizeof(struct Person);//幾個賦值結構體4printArray(&pArray, sizeof(struct Person), len, myPrintPerson);} int main() {test01();test02();system("pause");return 0; }3.2 結果顯示
1 2 3 4 5 name:aaa age:18 name:bbb age:19 name:ccc age:20 name:ddd age:21 請按任意鍵繼續. . .3.3 Callback02.c
#include <stdlib.h> #include <stdio.h> #define _CRT_SECURE_NO_WARNINGS struct Person {char name[64];int age; };//回調 int myComparePerson(void *data1, void *data2) {//指針類型轉換struct Person *p1 = data1;struct Person *p2 = data2;//strcmp() 會根據 ASCII 編碼依次比較 str1 和 str2 的每一個字符if ((strcmp(p1->name, p2->name) == 0) && (p1->age == p2->age)){return 1;}elsereturn 0;}//int myFind(void *arr, int eleSize, int len, void *data, void(*myCompare)(void *, void *)) //arr數組首地址 eleSize元素占的內存空間 data要查找元素的首地址 int myFind(void *arr, int eleSize, int len, void *data, int(*myCompare)(void *, void *)) {char *p = arr;for (int i = 0; i < len; i++){char *eleArr = p + i*eleSize;//每個元素的首地址//比較里面的元素是否相同if (myCompare(eleArr, data)){return 1;}}return 0; }void test04() {struct Person pArray[] = { { "aaa", 18 }, { "bbb", 19 }, { "ccc", 20 }, { "ddd", 21 }, { "eee", 22 } };struct Person p = { "aaa", 18 };//需要查找的int len = sizeof(pArray) / sizeof(struct Person);//幾個賦值結構體4//printArray(&pArray, sizeof(struct Person), len, myPrintPerson);int return_value = myFind(&pArray, sizeof(struct Person), len, &p, myComparePerson);//判斷if (return_value){printf("Find the element!");}else{printf("Did not find the element");} }int main() {test04();system("pause");return 0; }3.4 結果顯示
Find the element!請按任意鍵繼續. . .總結
以上是生活随笔為你收集整理的回调函数案列(C高级)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二级指针读取文件(显示行数、读取、释放内
- 下一篇: Linux下系统函数open,read,