志在指尖
用双手敲打未来

函数指针有什么用?

函数指针有什么用?

函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组相同,这里是指向函数。如前所述,C在编译时,每一个函数都有一个进口地址,该进口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量相同,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
假如在程序中界说了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表明的便是这个地址。既然是地址咱们就能够界说一个指针变量来寄存,这个指针变量就叫作函数指针变量,简称函数指针。
那么这个指针变量怎样界说呢?尽管同样是指向一个地址,但指向函数的指针变量同咱们之前讲的指向变量的指针变量的界说方式是不同的。例如:
int(*p)(int,int);
这个语句就界说了一个指向函数的指针变量p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的int表明这个指针变量能够指向返回值类型为int型的函数;后边括号中的两个int表明这个指针变量能够指向有两个参数且都是int型的函数。所以合起来这个语句的意思便是:界说了一个指针变量p,该指针变量能够指向返回值类型为int型,且有两个整型参数的函数。p的类型为int(*)(int,int)。
所以函数指针的界说方式为:
函数返回值类型(*指针变量名)(函数参数列表);
“函数返回值类型”表明该指针变量能够指向具有什么返回值类型的函数;“函数参数列表”表明该指针变量能够指向具有什么参数列表的函数。这个参数列表中只需求写函数的参数类型即可。
咱们看到,函数指针的界说便是将“函数声明”中的“函数名”改成“(*指针变量名)”。但是这儿需求留意的是:“(*指针变量名)”两端的括号不能省掉,括号改变了运算符的优先级。假如省掉了括号,就不是界说函数指针而是一个函数声明晰,即声明晰一个返回值类型为指针型的函数。
那么怎样判别一个指针变量是指向变量的指针变量仍是指向函数的指针变量呢?首先看变量名前面有没有“*”,假如有“*”说明是指针变量;其次看变量名的后边有没有带有形参类型的圆括号,假如有便是指向函数的指针变量,即函数指针,假如没有便是指向变量的指针变量。
最终需求留意的是,指向函数的指针变量没有++和–运算。函数
如何用函数指针调用函数
给我们举一个例子:
intFunc(intx);/*声明一个函数*/
int(*p)(intx);/*界说一个函数指针*/
p=Func;/*将Func函数的首地址赋给指针变量p*/
赋值时函数Func不带括号,也不带参数。由于函数名Func代表函数的首地址,因此通过赋值以后,指针变量p就指向函数Func()代码的首地址了。
下面来写一个程序,看了这个程序你们就了解函数指针怎样使用了:
#include
intMax(int,int);//函数声明
intmain(void)
{
int(*p)(int,int);//界说一个函数指针
inta,b,c;
p=Max;//把函数Max赋给指针变量p,使p指向Max函数
printf(“pleaseenteraandb:”);
scanf(“%d%d”,&a,&b);
c=(*p)(a,b);//通过函数指针调用Max函数
printf(“a=%d\nb=%d\nmax=%d\n”,a,b,c);
return0;
}
intMax(intx,inty)//界说Max函数
{
intz;
if(x>y)
{
z=x;
}
else
{
z=y;
}
returnz;
}
输出结果是:
pleaseenteraandb:34
a=3
b=4
max=4
【常识扩展】
指针是C言语的精华,也是C言语的难点,没学会指针便是没学会C言语。假如你觉得函数指针还能勉强承受的话,能够测验了解一些更复杂的指针,例如:
char*(*c[10])(int**p);
int(*(*(*pfunc)(int*))[5])(int*);
以上两个指针能分析清楚的话,那么99%的C言语指针问题都难不住你。

未经允许不得转载:IT技术网站 » 函数指针有什么用?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载