回调函数案例
案例 函数 回调
2023-09-14 09:02:34 时间
内置数据类型:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//回调函数---通用数组型打印案例
//参数1:数组首地址 参数2:数组中每个元素的大小 参数3:数组元素个数 参数4:回调函数对数组内容进行输出
void printArray(void* array, int size, int len, void(*MyPrint)(void *))
{
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
char* p = (char*)array;
for (int i = 0; i < len; i++)
{
//获取数组中每个元素的首地址----指针的步长
char* eleAddr = p + size * i;
//MyPrint(array[i]);是错误的----没有void*数组的概念
MyPrint(eleAddr);
}
}
void myPrint(void* data)
{
int* num = (int*)data;
printf("%d ", *num);
}
void test()
{
int arr[5] = { 1,2,3,4,5 };
int len=sizeof(arr) / sizeof(arr[0]);
printArray(arr, sizeof(int), len, myPrint);
}
int main()
{
test();
return 0;
}
自定义数据类型:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//回调函数---通用数组型打印案例
//参数1:数组首地址 参数2:数组中每个元素的大小 参数3:数组元素个数 参数4:回调函数对数组内容进行输出
void printArray(void* array, int size, int len, void(*MyPrint)(void *))
{
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
char* p = (char*)array;
for (int i = 0; i < len; i++)
{
//获取数组中每个元素的首地址----指针的步长
char* eleAddr = p + size * i;
//MyPrint(array[i]);是错误的----没有void*数组的概念
MyPrint(eleAddr);
}
}
struct person {
char ch[32];
int age;
};
void myPrint(void* data)
{
person* p = (person*)data;
printf("姓名:%s\t年龄:%d\n", p->ch, p->age);
}
void test()
{
person p[5] = {
{"大忽悠",18},
{"小忽悠",18},
{"小朋友",19},
{"大朋友",19},
{"happy end",100},
};
printArray(p, sizeof(person), 5, myPrint);
}
int main()
{
test();
return 0;
}
增加查找的功能:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//查找元素
//参数1:数组首地址 参数2:数组中每个元素的大小 参数3:数组元素个数 参数4:查找的元素
//参数5:回调函数,将data传入回调函数,更据用户需求进行对比操作,对比函数由用户自己写
int findArrEle(void* arr, int size, int len, void* data,int(*compare)(void*,void*))
{
//void*没有数组的概念,因此如果想通用可以用char*,如果用int*的话,打印字符串等等其他数据类型可能会出现乱码
char* p = (char*)arr;
for (int i = 0; i < len; i++)
{
//获取数组中每个元素的首地址----指针的步长
char* eleAddr = p + size * i;
if (compare(eleAddr,data))
{
return 1;
}
}
return 0;
}
struct person {
char ch[32];
int age;
};
//对比的函数
int compare(void*eleAddr, void*data)
{
person* p1 = (person*)eleAddr;
person* p2 = (person*)data;
if (strcmp(p1->ch,p2->ch)==0 && p1->age == p2->age)
{
return 1;
}
return 0;
}
void test02()
{
person p[5] = {
{"大忽悠",18},
{"小忽悠",18},
{"小朋友",19},
{"大朋友",19},
{"happy end",100},
};
person p1 = { "大忽悠",18};
int ret=findArrEle(p, sizeof(person), 5, &p1, compare);
if (ret==1)
printf("查到");
else
printf("没查找到");
}
int main()
{
test02();
return 0;
}
相关文章
- Ajax基本案例详解之load的实现
- RMAN备份:一个典型的增量备份案例如下:
- 记一次从JS到内网的横向案例
- Spark修炼之道(进阶篇)——Spark入门到精通:第十节 Spark SQL案例实战(一)
- OpenCV各模块、函数详解及应用案例
- Python视觉深度学习系列教程 第一卷 第22章 案例:微笑检测
- 回调函数---通用数组排序案例
- Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
- Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略
- Python语言学习之pandas:DataFrame二维表的简介、常用函数、常用案例(增删改查排序之选择指定列、根据条件选择特定数据、赋值、列名重命名、修改列数据、处理缺失值、列合并、分组之详细攻略
- C++:C++编程语言学习之函数/结构体和类的简介、案例应用之详细攻略
- CV之OpenCV:HALCON机器视觉软件简介&OpenCV的基础概念、常用案例(打开图片/摄像头/视频)、常用函数解释大全(C++/python语言)之详细攻略
- Python之sklearn:GridSearchCV()和fit()函数的简介、具体案例、使用方法之详细攻略
- ML之FE:数据处理—特征工程之高维组合特征的处理案例(矩阵分解)——基于LoR算法的广告点击预估问题
- ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介、损失函数/代价函数/目标函数之间区别、案例应用之详细攻略
- Python语言学习:Python语言学习之正则表达式常用函数之re.search方法【输出仅一个匹配结果(内容+位置)】、re.findall方法【输出所有匹配结果(内容)】案例集合之详细攻略
- Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略
- 100天精通Python(数据分析篇)——第66天:Pandas透视表基础+实战案例(pivot_table函数)
- 100天精通Python(数据分析篇)——第63天:Pandas使用自定义函数案例(pipe、apply、map、applymap、agg)
- Java 8十个lambda表达式案例
- 通过Oracle识别字符串中的中文or字母or数字来介绍全角半角转换函数(to_multi_byte/to_single_byte)在varchar/clob中的使用案例
- Linux【实操篇】—— Shell函数、Shell编程综合案例(定时备份数据库)
- 【SPSS】列联表分析详细操作教程(附案例实战)
- SLAM:SLAM(即时定位与地图构建)的简介、发展、案例应用之详细攻略
- ML之KG:基于MovieLens电影评分数据集利用基于知识图谱的推荐算法(networkx+基于路径相似度的方法)实现对用户进行Top电影推荐案例
- QT案例实战1 - 从零开始编写一个OCR工具软件 (6) 关于QThread线程的使用
- POI批量导入及一键上传ocupload和pinyin4j组件的使用案例
- a19.ansible 生产实战案例 -- docker基于二进制安装harbor-https方式 roles
- a3.ansible 生产实战案例 -- 系统初始化roles