在C语言中,一个函数总是占用一段连续的内存区(位于程序的代码区),而函数名就是函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们称这种指向函数的指针变量称为"函数指针变量"。
函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
对比普通指针变量定义的一般形式:
类型说明符 *指针变量名;
其中"类型说明符"表示被指函数的返回值的类型。"(*指针变量名)"表示"*"后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。
例如:
int (*pf)();
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整形。
【例10.31】本例用来说明用指针形式实现对函数调用的方法。
#include<stdio.h> int max(int a, intb) { if(a > b) return a; return b; } int main(int argc,char* argv[]) { int (*pmax)(); int x,y,z; pmax = max; printf("input two numbers:n"); scanf("%d%d", &x,&y); z = (*pmax)(x, y); printf("maxnum=%dn", z); return 0; } |
从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:
1) 先定义函数指针变量,如上面程序中 int(*pmax)();定义pmax为函数指针变量。
2)把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行pmax=max;
3)用函数指针变量形式调用函数,如程序第14行z=(*pmax)(x,y);
4) 调用函数的一般形式为:
(*指针变量名)(实参表)
使用函数指针变量还应注意以下两点:
a)函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针
移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
b)函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一
种表示符号。
还应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。
如int(*p)()和int*p()是两个完全不同的量。
a) int(*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,
(*p)的两边的括号不能少。
b)int*p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的
指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。