c/c++学习笔记(9)
指向函数的指针
在C/C++语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。由于指向函数的指针还是实践的比较多,书中是以改写快速排序为例子的,现在呢,我们就来编写一个线性排序。
1 int lsearch(void *key, void *base, int n, int elementSize, int(*cmpfn)(void *, void *)) 2 { 3 for(int i = 0; i < n; i++) 4 { 5 void *elementAddress = (char *)base + i * elementSize; 6 if(cmpfn(key, elementAddress) == 0) 7 { 8 return i; 9 } 10 } 11 return -1; 12 }
接下来,先做一个在int数组中查找元素,代码如下:
1 int array[] = {1, 2, 3, 4, 5, 6, 7, 9}; 2 int size = 9; 3 int number = 5; 4 int index = lsearch(&number, array, size, sizeof(int), intcmp); 5 printf("%d", index);
因为intcmp是一个函数指针,其指向的是一个返回int且有2个void *参数的函数,实现如下:
1 int intcmp(void *p1, void *p2) 2 { 3 int *num1 = (int *)p1; 4 int *num2 = (int *)p2; 5 return num1 - num2; 6 }
以上我们就是先了int版本的查找,接着我们来实现字符串类型的查找。
1 char *arr[] = {"aa", "bb", "cc", "dd"}; 2 char *s = "aa"; 3 int size = 4; 4 int index = lsearch(&s, arr, size, sizeof(char *), Strcmp); 5 printf("%d", index);
我们不能将这个函数指针定义为strcmp是因为库里面已经有这个函数了,且库里面的strcmp的2个参数是char *的,不匹配。Strcmp的实现如下:
1 int Strcmp(void *p1, void *p2) 2 { 3 char *s1 = *(char **)p1; 4 char *s2 = *(char **)p2; 5 return strcmp(s1, s2); 6 }
到此,今天的学习就结束了,明天继续,加油!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述