c语言回调函数理解,关于c语言中回调函数的理解.pdf

本文介绍了回调函数的概念,它是如何通过函数参数传递代码引用,使得底层代码能够调用高层定义的子程序。在C语言中,回调函数通过函数指针实现。文章详细解释了函数指针的声明、用途以及初始化,并通过一个简单的排序函数示例展示了如何使用回调函数。最后,给出了一个使用qsort函数的例子,进一步阐述了回调函数在实际编程中的应用。
摘要由CSDN通过智能技术生成

关关于于c语语言言中中回回调调函函数数的的理理解解

前前言言

在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递 其它代码的,某一块可执行代码的引用。这一设计允许

了底层代码调用在高层定义的子程序。

这段话不是那么好理解,不同语言实现回调的方式有些许不同。其实可以这样理解,回调就是在一个函数中调用另外一个函数。

在c语言中,回调是使用函数指针来实现的。 函数指针――顾名思义,是指向一个函数的指针。通常函数指针有两个方面的用途

,一个是转换表 (j ump table),另一个是作为参数传递给一个函数。

下面是两个函数指针的声明

int(*f)(int,float);int*(*g[])(int,float);

前者把f声明为一个函数指针,它所指的函数接受两个参数,分别是一个整型值和浮点型值,并返回一个整型值。

后者把g声明为一个数组,数组的元素类型是一个函数指针,它所指向的函数接受两个参数,分别是一个整型值和浮点型值,并

返回一个整型指针。

需要注意的是,简单声明一个函数指针并不意味着它马上就可以使用。和其他指针一样,对函数指针执行间接访问之前必须把它

初始化为指向某个函数。下面的代码段说明了一种初始化函数指针的方法。

intf(int);int(*pf)(int) = f;

第 2 个声明创建了函数指针pf ,并把它初始化为指向函数f 。函数指针的初始化也可以通过一条赋值语句来完成。在函数指针的

初始化之前具有f 的原型是很重要的,否则编译器就无法检查f 的类型是否与pf所指向的类型一致。

通过一个例子简单介绍回调函数的使用

大家应该都对c语言的库函数qsort有所了解,qsort声明如下

void qsort(void*base,size_tnitems,size_tsize,int(*compar)(constvoid*,constvoid*))

可以看 ,它的第三个参数是一个函数指针,传入两个没有定义指针指向的类型的参数a,b,返回一个整型值。实际上这里使

用了回调函数。通过回调函数,qsort可以在运行时调用用户定义的函数 (底层代码调用在高层定义的子程序)。

这里我们设计一个简单的sort函数,来理解回调过程

1、定义函数指针

typedefint(*compar)(constint*a,constint*b);

2、自定义sort函数,为了简单,这里使用冒泡排序

int*sort(int*nums,intn, compar cmp) int*target =malloc(n*sizeof(int));if(!target) perro

r("Memory error");memcpy(target, num, n *sizeof(int));for(inti =0; i < n; i++) for(int

j = i+1; j < n; j++) if(cmp(target[i], target[j]) >0) target[i] ^= target[j] ^= targe

t[i] ^= target[j];}}}returntarget;}

3、实现函数回调

#include#include#include#includetypedefint(*compa

r)(constint*a,constint*b);// 定义实现回调函数的"调用函数"int*sort(int*nums,intn, compar cm

p) int*target =malloc(n*sizeof(int));if(!target) perror("Memory error");memcpy(target,

num, n *sizeof(int));for(inti =0; i < n; i++) for(intj = i+1; j < n; j++) if(cmp(targ

et[i], target[j]) <=0) target[i] ^= target[j] ^= target[i] ^= target[j];}}}returntarge

t;}

// 定义回调函数intcmp1(inta,intb) returna < b;}intmain(intargc,charconst*argv[]) inta[10

] =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值