当前位置: 首页 > news >正文

从零开始的C语言学习014 指针5

1.回调函数

回调函数是⼀个通过函数指针调用的函数。

把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。

什么意思呢?

简单来说就是需要用到该函数的时候不直接调用,而是通过另外一个函数来调用,这样就被称之为回调函数。

(以下是回调函数的转移表)

        

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
void calc(int(*pf)(int, int))
{int ret = 0;int x, y;printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = pf(x, y);printf("ret = %d\n", ret);
}int main(){int input = 1;do{printf("*************************\n");printf("  1:add          2:sub  \n");printf("  3:mul          4:div  \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(add);break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

我们这里重点说一下这个函数:

这个函数是什么意思?

void calc(int(*pf)(int, int))

那这样呢?

int(*pf)(int,int)

显然这是一个函数指针,接受一个地址,返回一个int类型的值。

这里的pf可以是任何符合形式的函数,只需要接受对应的函数地址即可使用。

那整体来说。calc就需要传一个函数地址。

而这里的calc(add)便是接受了函数add的地址。pf便成为了有加法作用的函数。

2.qsort函数使用

qsort是一个库函数,但和可以直接使用的库函数不同,qsort函数需要使用者自己去定义一个比较函数。

这里我们可以先看一下qsort函数的定义:

(这里其实应该是nitems,但显然count大家都学过)

void qsort(void *base, size_t count, size_t size, int (*compar)(const void *, const void *));

比较函数是用户自定义的,用于确定两个元素的相对顺序:

int (*compar)(const void *, const void *)

至于其他的则已经编译完成,只需要填上对应的:

  • base: 指向待排序数组的起始地址。

  • count: 数组中元素的个数。

  • size: 每个元素的大小(以字节为单位)

为什么比较函数需要使用者自己定义,而不是编译器帮你定义呢?

因为这两个元素不一定是数字。

如果是数字的话,只需要加或者减即可,但这个比较的范围扩大到字符就无法比较了。

这里我们先给出如何比较数字:

#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);return 0;
}

而如何比较字符/字符串呢?

我们可以想到之前的字符串比较函数:strcmp

这样其实就非常简单了,不多赘述。

3.qsort函数的实现

实现一个项目之前永远要想想看它的功能是什么。

qsort便是比较函数并排序。

那怎么比较?怎么排序?

会接受什么类型?用什么类型去接受并比较?

想明白的话我们便可以用冒泡排序的思维去解决,不过是将int类型改为char类型。

#include <stdio.h>
void _swap(void* p1, void* p2, size_t size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1 + i);*((char*)p1 + i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}
void bubble(void* base, size_t count, size_t size, int(*cmp)(void*, void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){_swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}
}

这里的cmp便是需要使用者自己手写的地方。

http://www.dtcms.com/a/458814.html

相关文章:

  • photoshop做图网站长春建设集团股份有限公司网站
  • 都江堰旅游门户网站电子商务网站的开发语言
  • 卡片式设计的网站旅游网站建设系统
  • 做铁合金用哪个外贸网站好烟台网站建设的方法有哪些
  • 网站建设需要哪些企业资料网络营销有哪些策略
  • 网站开发的调研内容今天的新闻联播直播在线观看
  • 做网站属于什么备案成都网站建设十强企业
  • 网站统计怎么做域名的申请注册
  • 做网站专用素材wordpress里文章图片无法显示
  • 基于51单片机的室内烟雾温度与人体监测报警系统设计
  • 青岛网站建设培训学校wordpress手机字体变大6
  • 哈尔滨高端品牌网站建设建筑模板质量标准
  • 做订单管理网站用什么软件郑州网站制作方案
  • 百度网站推广申请Wordpress ajax 相册
  • 苏州建设网站的公司做网站分期付款比例
  • 购物网站页面桂林网站seo
  • 义乌网站建设推广网站建设方案流程
  • 企业网站的建设目的包含什么wordpress 获取页面
  • 做网站商机网络设计的安全性原则主要是指
  • 电商网站设计趋势千库网ppt
  • 网站设计可以用性原则怎么做义工网站
  • 山东省城乡和住房建设厅网站wordpress二级目录创建
  • intellij idea做网站wordpress文章顶置
  • 网站营销推广有哪些阿里巴巴网站怎样做的漂亮
  • 苏州专业网站建设公司wordpress新增站点
  • 网站四网合一品牌设计工作内容
  • 网站开发公司的销售方式厦门网站建设 孚珀科技
  • 电子商务网页设计与网站建设论文婚庆设计效果图
  • 网站欢迎页怎么做网站建设工作思路
  • 用psd做的买书网站商城网站建站程序