函数指针

来源:互联网 发布:螺纹铣刀编程公式 编辑:程序博客网 时间:2024/06/02 03:17

读大学的时候,专业老师故意避开了函数指针这一部分没有讲,说这个太难了,怕很多同学不懂,打消对学习的积极性。当时在学校基本上用不到,也没去管了,所以一直对函数指针敬而远之。后来发现在工作中,回调,函数指针用得特别多,不管有多难,这个必须得弄懂。借用周末的时间再重新学习一遍,补C基础。以下内容参考了《嵌入式实时操作系统uC/OS-II》p37~p43。

函数指针是最重要的C指针之一,它可以指向一个函数。
一个函数就一段代码。C编译器会为这段代码分配一段连续的内存空间,同时把首地址作为常量值赋予以函数名定义的常量。这就是说,函数名就该函数的指针。
函数指针可以保存于一个指针变量,并在程序中通过这个函数指针变量调用这个函数。指针变量也称这“指向函数的指针变量”或函数指针变量。在不会产生歧义的情况下,函数指针变量也叫做函数指针。
与定义一个变量的指针变量方法相似,在函数定义格式中,如果在函数 名的前面做用了符号“*”,那么这里的函数名就变成了函数指针变量,即定义一个函数指针变量的格式如下:

返回值类型 (*变量名)(参数1类型,参数2类型,……)

其中

返回值类型 (*)(参数1类型,参数2类型,……)

为函数指针变量的类型。
用法示例:

#include<stdio.h>int function1(int ,float){    printf("%s\n","function1");    return 0;}int function2(int ,float){    print("%s\n","function2");    return 0;}int (*pfunction)(int ,float);int main(){    pfunction = function1;    pfunction(11,1111.0);    pfunction = function2;    pfunction(22,2222.0);    return 0;}

示例表明可以通过函数指针变量来间接调用函数,而且同一个函数指针变量还可以随时通过关联的函数名来改变它所指向的函数 ,因而使得同一个指针变量可以调用不同的函数,只要它们的返回类型和参数类型相同。

原来函数名就是一个指针,存储的就是指向一段连续存储空间的首地址,和本质上和数组名没有什么区别,只是两者实现的功能有所不同。既然函数名就是一个指针,那就应该可以其它数据类型指针一样作为函数参数。

#include<stdio.h>int function1(int ,float){    printf("%s\n","function1");    return 0;}int function2(int ,float){    print("%s\n","function2");    return 0;}void user_Function(void (*pf)(int ,float)){    pf(0.0.0);}int main(){    user_Function   (function1);    user_Function(function2);       return 0;}

将函数指针作为函数参数,可以将一个函数传递到另一个函数内来调用,这种调用方式也叫回调。

目前,大致有两种方法来实现函数的调用:一种方法就是上面例程那样,将函数指针作为用户函数参数传递给用户函数。供用户函数调用;另一种方法就是在系统函数中设置所谓的“钩子函数”,即在系统函数中需要调用用户功能的地方调用一个空函数,然后由用户去实现这个空函数的功能,在第一种方法中,由于是系统函数调用用户函数,与常用的用户程序调用系统函数的调用方向不同,故人们将这种调用叫做“回调”,而被系统调用的这个函数就叫做“回调函数”(回调是一种执行方式,动作。回调函数是一个函数,两者概念上还有区别的)。

0 0
原创粉丝点击