指向函数的指针
程序中定义函数后,对程序进行编译时,编译系统为函数分配一段存储空间存储二进制代码,这段内存空间的起始地址(也称入口地址)称为函数的指针。
程序中可以定义一个指针变量,用来存放一个函数的起始地址,即该指针变量指向一个函数,称为函数指针变量。函数指针变量定义的一般形式如下:
类型说明符(*指针变量名)(函数的形参列表);
说明:
(1)函数指针变量可以指向的函数满足两个条件:函数的返回值由上面“类型说明符”确定;函数的形参列表与上面“函数的形参列表”相同。例如,下面是几个函数指针变量定义的例子。
int(*pl)(int a, int b);
double(* p2)( double x);
其中,函数指针变量pl可以指向返回值类型为int,形参是两个int类型变量的函数;函数指针变量p2可以指向返回值类型为 double,形参是一个 double类型变量的函数。
实际上函数指针变量定义时,形参的名字对编译没有意义,习惯上省略不写。例如上面两个函数指针变量通常写成如下形式
int(* pl)(int, int );
double(* p2)( double);
(2)使用函数指针变量调用函数之前,必须使函数指针变量指向一个函数(函数的起始地址赋值给函数指针变量)。一般形式如下:
函数指针变量=函数名;
注意,赋值符右边只写函数名,不需要定参数表。如果写上参数会出现编译错误。例如:
pl=func;
赋值符右边是一个函数名,且该函数定义时返回类型是int,有两个int类型的形参。(3)通过函数指针变量调用函数的一般形式如下:
(*函数指针变量)(实参列表);
通过函数指针变量调用函数的效果与使用函数名调用函数的执行流程是一样的,实参与形参同样要求个数相同,类型符合赋值兼容规则。例如
int c=(*p1)(100,10);
上面语句调用指针p1指向的函数,实参为100和10,返回值赋值给变量c。
(4)对函数指针变量进行加或减整数等操作是没有意义的,可能会导致程序运行错误。
【例】编程实现两个整数的四则运算,使用函数指针变量调用函数。
源代码如下:
#include <stdio.h>
int add( int a, int b);
int sub( int a, int b);
int mul( int a, int b);
int div( int a, int b);
int main()
{
int x, y, z;
char op;
int (*p)(int,int); //定义函数指针变量
printf("输入整数四则运算式:");
scanf("%d%c%d",&x,&op,&y); switch(op)//根据运算符不同使p指向不同的函数
{
case'+':p=add; break;
case'-':p=sub; break;
case'*':p=mul; break;
case'/':p=div; break;
default:
printf("运算符输入错误!\n");
return 0;
}
z=(*p)(x,y);//通过函数指针变量调用函数
printf("%d%c%d=%d \n", x,op,y,z);
return 0;
}
int add( int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}
程序运行结果: