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