在前面章节中我们学习了如何定义并使用一种特殊型变量——指针。其实指针也是一种普通变量,只不过它们存放的值表示的是其它变量的内存地址。在本节我们要学习指针的另一种用法,存放函数的内存地址。例如:
#include <stdio.h>
void myfunc(void)
{
printf("my function.\n");
}
int main(int argc, char *argv[])
{
void (*p)(void) = &myfunc;
p();
return 0;
}
在这里我们定义了一个指针型变量p,这个变量p指向了我们所定义的一个函数myfunc()的地址,也就是是&myfunc(与普通变量一样,取变量地址的运算符是 &)。像这样,当我们定义一个指针变量并使这个指针变量指向一个函数时,我们称这个指针是指向函数的指针,简称函数指针。注意,在定义函数指针时一定要在指针变量和 * 两边加上小括号(*p)(void)表示这是一个函数指针,并在其后加入一对小括号表示这个函数的参数。
然后我们就可以将一个函数的地址赋值给这个指针p。一旦指针变量指向了一个函数,那么这个指针变量就可以执行它所指向的函数了。例如:
p();
执行这句代码的作用与执行myfunc();的作用一致,运行结果为:
my functions.
下面我们再来定义两个指向有参数函数并有返回值的函数的指针,用于计算两个数的和:
#include <stdio.h>
int add_int(int a, int b)
{
return a + b;
}
float add_float(float a, float b)
{
return a + b;
}
int main(int argc, char *argv[])
{
int (*p0)(int, int) = &add_int;
int res0 = p0(2, 3);
float (*p1)(float, float) = &add_float;
float res1 = p1(2.2, 3.3);
printf("%d\n%f\n", res0, res1);
return 0;
}
我们定义了两个指针变量,p0指向了函数add_int()而p1指向了函数add_float()。最后,当我们执行p0(2, 3);时,就相当于执行了add_int(2,3);而执行p1(2.2, 3.3);时,就相当于执行了add_float(2.2, 3.3);
使用函数指针有很多好处,例如我们可以使用函数指针来实现通用的数据结构和通用算法等等。关于指针函数的高级用法在《C语言基础》这个系列中我们并不再做过多的介绍,如果有兴趣的朋友可以参见《C语言深处》系列教程。
Copyright © 2015-2023 问渠网 辽ICP备15013245号