函数指针与指针函数
函数指针:
如果在程序中定义了一个函数,那么编译时系统就会为这个函数分配一段存储空间, 这段存储空间的首地址称为这个 函 数 的 地 址。而且函数名表示的就是这个地址。既然是地址,我们就可以定义一个 指针变量来存放,这个指针变量就叫做 函 数 指 针 变 量,简称为 函 数 指 针。指向函数的指针包含了函数的地址的入口地址(首地址),可以通过它来调用函数。
定义函数指针:
那么这种指针变量如何定义呢,虽然同样是指向一个地址,但指向函数的指针变量与指向变量的指针在定义方式上是不同的,例如:
int(*p)(int x,int y);
上述语句定义了一个指向函数的指针变量 “p”,首先它是一个指针变量,所以p的前缀为" * "符,即 " *p ",其次前面的int表示这个指针变量可以指向返回值类型为int类型的函数( int(*p) ),后面参数列表括号中的两个int( “(int x,int y)” )表示这个指针变量可以指向有两个参数,且参数类型都是int类型的函数
所以这个语句的意思是:定义一个指针变量p,该指针变量可以指向返回值类型为int型,且有两个整型参数的函数,函数指针p的类型为[ int(*)(int,int) ];
函数指针的定义方式为:
函数返回值类型(*指针变量名)(函数参数列表);
函数返回值类型:表示该指针变量可以指向具有何种返回类型的函数
函数参数列表:表示该指针变量可以指向具有何种参数列表的函数,这个参数列表中只需要写函数的参数类型即可,不需要写参数的名字。
总结:🌟
函数指针的定义就是将 [ 函数声明 ] 中的 [ 函数名 ] 改成了 [ (*指针变量名) ] 。但需要注意的是: [ (*指针变量名) ] 两端的括号是不能省略的。括号改变了运算符的优先级,如果省略括号,就不是定义函数指针而是声明了一个返回值类型为指针的指针函数。
如何判断一个指针变量是指向变量还是指向函数:首先看变量名前面是否有 “*” 如果有,说明其首先是指针变量,其次看变量名后面有没有带形参列表的圆括号,如果有就是指向函数的函数指针,否则就是指向变量的指针变量。
注意:🎯
1.指向函数的指针变量没有++
和--
运算。
2.函数指针调用函数时,函数指针与 被调用的函数的返回值类型,参数列表中参数的个数,参数的类型必须完全一致
如何用函数指针调用函数:
例如:
fun(int x,int y);
void main()
{
int (*p)(int x,int y); //声明一个函数指针 p
p=fun; //给函数指针p赋值,使它指向函数fun(将func函数的首地址赋值给指针p)
a=(*p)(x,y); //通过指针p调用函数fun
}
赋值时函数fun不带括号,也不带参数。这是因为函数名fun代表存放这个函数的内存空间的首地址,因此经过赋值给函数指针p以后,指针变量p就指向函数fun()的代码首地址了(也就是可以通过函数指针p调用这个fun()函数)。
函数指针的实际应用:
int max(int x, int y);
int main()
{
int(*fp)(int x,int y);
int a, b, c;
fp = max;
printf("请输入两个需要进行比较的值: ");
cin >> a >> b;
c = (*fp)(a, b);
//todo 也可以写作 c = fp(a, b);
printf("a=%d b=%d