函数指针是指向函数的指针变量。 因而“函数指针“本质是指针变量,只不过该指针变量指向函数。在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,我们就可以用指针变量调用函数,就如同用指针变量可引用其他类型变量一样。函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法为:
函数返回类型 (标识符指针变量名)(形参列表);
注意:“(标识符指针变量名)”的括号不能省,若省略则成为一个指针函数的声明;后面的“形参列表”表示指针变量指向函数所带的参数列表。
例:int function(int a);//声明一个函数
int(*funptr)(int a);//声明一个函数指针
funptr=function;//将function函数的首地址赋给指针funptr
赋值时,函数function不带括号,也不带参数。经过赋值后,指针funptr就指向函数function(int a)的代码的首地址。
#include<stdio.h>
int max(int x,int y)
{
return(x>y?x:y);
}
int main()
{
int (*p)(int, int);
int a,b,c;
p=max;
scanf("%d%d",&a,&b);
c=(*p)(a,b);//p(a,b)也可以
printf("a=%d,b=%d,max=%d",a,b,c);
}
p是指向函数的指针变量,所以可把函数max()赋给p作为p的值,即把max()的入口地址赋给p,就可以用p来调用该函数,实际上p和max都指向同一个入口地址,不同就是p是一个指针变量,不像函数名称那样是死的,它可以指向任何函数。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算。typedef的使用:
1、定义函数指针类型:
typedef int(*funptr)(int x,int y);
2、声明变量和赋值:
funptrmax_fun=max;
#include<stdio.h>
int max(int x,int y)
{
return(x>y?x:y);
}
int main()
{
typedef int(*funptr)(int x,int y);
int a,b,c;
funptr max_fun=max;
scanf("%d%d",&a,&b);
c=(*max_fun)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
typedef的功能是定义新的类型。第一句就是定义了一种funptr的类型,并定义这种类型为指向某种函数的指针,这种函数以一个(int,int)为参数并返回int类型。后面就可以像使用int,char一样使用funptr了。
函数指针数组
函数指针数组是一个其元素是函数指针的数组。函数指针数组声明与函数指针声明差不多,就是变量变成了数组。
函数指针数组声明: int (*funs[2])(int a,int b);
#include "stdio.h"
int add(int a,int b){return a+b;}
int minus(int a,int b){return a-b;}
int main()
{
int a=1,b=2;
int (*funs[2])(int a,int b);
funs[0]=add;
funs[1]=minus;
printf("%d %d\n",funs[0](a,b),funs[1](a,b));
return 0;
}
函数指针数组的赋值与一般数组一样,有两种方式:静态定义和动态赋值。
1、 静态定义:
int (*funs[ ])(void)={fun1,fun2,fun3};
2、动态赋值
int (*funs[3 ])(void);
funs[0]=fun1;
funs[2]=fun2;
funs[2]=fun3;