C语言基础

    返回首页    发表留言
本文作者:李德强
          第八节 函数指针
 
 

        在前面章节中我们学习了如何定义并使用一种特殊型变量——指针。其实指针也是一种普通变量,只不过它们存放的值表示的是其它变量的内存地址。在本节我们要学习指针的另一种用法,存放函数的内存地址。例如:

#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号