C语言指针—指向函数的指针
1.什么是函数指针
在程序中定义了一个函数,在编译时,系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
一般形式:
类型名 (*指针变量名)(函数参数表列)
例如:
int (*p)(int int)
定义p是一个指向函数的指针变量,它可以指向函数的类型为整型且与两个整型参数的函数。p的类型用int(*)(int,int)表示。
2.函数指针变量的应用
(1)用函数求整数a和b的大者
#include
int max(int x,int y)
{
int z;
if(x>y)
{
z=x;
}
else
{
z=y;
}
return (z);
}
int main()
{
int (*p)(int ,int); //定义指向函数的指针变量
int a,b,c;
p=max; //使p指向max函数
printf("please enter a and b:\n");
scanf("%d,%d",&a,&b);
c=(*p)(a,b); //通过指针变量调用max函数
printf("a=%d\nb=%d\nmax=%d\n",a,b,c);
return 0;
}
程序分析:
“int()p(int int);”用来定义一个指向函数的指针变量。注意(*p)两侧的括号不能省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示函数,即该指针变量不是指向一般的变量,而是指向函数。
如果写成了“int p(int int)”,由于()优先级高于*,它相当于“int*(p(int int)),就成为声明一个p函数了
赋值语句“p=max”的作用是将函数的入口地址赋给指针变量p,p就是指向函数max的地址。即c=(*p)(a,b);和c=max(a,b)等价。
(2)利用一个函数实现多个函数的功能
问题:有两个整数a和b用户输入1,2或3。如输入1,,程序就给出a和b中的大者;如输入2,程序就给出两者中的小者;如输入3,程序就给出a和b的和。
#include
int main()
{
int fun(int x,int y,int (*p)(int,int));
int max(int,int);
int min(int,int);
int add(int,int);
int a=34,b=-21,n;
printf("please choose 1,2or3: ");
scanf("%d",&n);
if(n==1)
{
fun(a,b,max);
}
if(n==2)
{
fun(a,b,min);
}
if(n==3)
{
fun(a,b,add);
}
return 0;
}
int fun(int x,int y,int(*p)(int,int)) //定义fun函数
{
int result;
result=(*p)(x,y);
printf("%d\n",result); //输出结果
}
int max(int x,int y) //定义max函数
{
int z;
if(x>y)
{
z=x;
}
else
{
z=y;
}
printf("max=");
return (z); //输出两者中的大值
}
int min(int x,int y) //定义min 函数
{
int z;
if(x>y)
{
z=y;
}
else
{
z=x;
}
printf("min=");
return(z); //输出两者中的小值
}
int add(int x,int y) //定义add函数
{
int z;
z=x+y;
printf("min=");
return(z); //返回值是两数中之和
}
运行结果:
若输入1
please choose 1,2or3: 1
max=34
若输入2
please choose 1,2or3: 2
min=-21
若输入3
please choose 1,2or3: 3
add=13
程序分析:
在定义fun函数时函数首部用“int(*p)(int,int)”声明形参p是指向函数的指针。调用fun函数时,函数名min,max,add,作为实参将其入口地址传送给fun函数中的形参p。
3.指针变量使用说明
(1)定义指针变量只能指向定义时指向的函数。如前面的“int (*p)(int ,int );“表示指针变量p只能指向返回值为整型且有两个整型参数的函数。然后把那个函数名赋给函数名即可。
(2)如果要用指针点调用函数,必须使指针变量指向该函数。如:
p=max;
这就把max函数的地址赋给指针变量p.
(3)再给函数指针变量赋值时,只需给出函数名而不必给出参数。如:
p=max;
因为只是赋地址,若“p=max(a,b)”为函数的调用,故错误。
(4)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),
在(*p)之后的括号中根据需要写上实参。例如:
c=(*p)(a,b);
(5)对指向函数的指针不能进行算术运算,如:p+n,p++。
4.指向函数的指针应用条件:
通常通过编写一个通用的函数来实现各种专用的功能。例如第二个程序中通过输入一个数字,然后通过输入不同的值调用不同的函数,实现不同的功能。当然也可以用if语句或switch语句进行判断,调用不同的函数。但是用指针变量显得更专业。