函数指针:
在程序运行中.函数代码是程序的算法指令部分,他们和数组一样也需要占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针
1:函数指针定义
函数类型 (*指针变量名)(形参列表);
函数类型-------函数的返回类型,由于"()"的优先级高于"*"所以指针变量名外的括号必不可少,后面的"形参列表"表示指针变量指向的函数所带的参数列表
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时候要注意:
a:函数指针和它所指向的函数的参数个数和类型都应该是一致的
b:函数指针的类型和函数的返回值类型也是必须一致的
2:函数指针的赋值
函数名和数组名一样代表了函数代码的首地址,因为在赋值时,直接将函数指针指向函数名就可以了;
例如: int func(int x);/*声明一个函数*/
int (*f)(int x);/*声明一个函数指针*/
f=func;/*将func函数的首地址赋给指针f*/
赋值时候函数func不带括号,也不呆参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(X)的代码的首地址
3:通过函数指针调用函数
函数指针是通过函数名和有关参数进行调用的
和其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于他所指向的变量i;
如果pf是指向浮点型变量f的指针,则*pf就等价于它所指向的变量f.同样的 *f是指向函数func(x)的指针,则*f就代表它所指向的函数func.所以在执行了f=func;以后(*f)和func代表同一个函数.
由于函数指针指向了存储区域的某个函数,因此可以通过函数指针调用响应的函数.用函数指针调用函数它应该执行下面三步:
1:要说明函数指针变量.int (*f)(int x);
2:要对函数指针变量赋值 f=func;func(x)必须要先有定义
3:要用(*指针变量)(参数表);调用函数 (*f)(x);(x必须先赋值)
例:
#include<iostream>
using namespace std;
int pos(int x)
{
return(5*x);
}
void main()
{
int i;
int (*pf)(int);
pf=pos;
i=(*pf)(20);
cout<<i<<endl
}
例子:
#include<iostream>
using namespace std;
functest(int x,int y)
{
int z;
z=(x>y)?x:y;
return(z);
}
void main()
{
int a,b;
int (*p)(int,int); /* 定义函数指针 */
p=functest; /* 给函数指针p赋值,使它指向函数f */
for(int i=1;i<9;i++)
{
cin>>b;
a=(*p)(a,b); /* 通过指针p调用函数f */
}
cout<<"The Max Number is:"<<a<<endl;
}
理解的函数指针就是一个指向函数首地址的指针 和指向内存的数组字符是一样的,就是需要理解清楚地是 我们一般认为的函数名就是一个地址,这个地址是可以直接的赋值给指针的,因为指针就是保存地址的地方,这样就理解了