引子
上一节,我们通过例子知道,何如定义一个函数指针,并且把这个指针指向函数,现在我们进一步看看该如何定义和使用指向函数的指针变量。
定义
定义指向函数的指针变量一般形式为:
类型名 (* 指针变量名)(函数参数表列)
int (*p)(int,int);
注意,指针变量名必须用括号包起来。类型名,是指函数返回值的类型。
注意
- 定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数。三点要一致,
返回值类型和参数数量、参数类型,只有定义指针变量时这三点和需要指向的函数相同,才能指向该函数。我们可以将一个指针先后指向同类型的不同函数。 - 如果要用指针变量调用函数,必须将指针与函数相连接,也就是将指针变量指向该函数。
int max(int a, int b);
int ( *p )( int , int );
p=max; //这里就是将 max 的入口地址赋值给 p,p 指向了该函数
- 在将指针变量指向函数的时候,不必包含函数参数,因为这里没有虚实结合的过程,并且
传递的是函数的入口地址。 - 在使用指针调用函数的时候,非常简单,只要把函数名替换成(*指针名)。
p=max;
// 下面两个是等价的
max( a , b);
( * p )( a , b );
- 对指向函数的指针,不能进行算术运算,例如加减,加加减减都是无意义的,因为不能移动指针到下一个函数。
- 用函数名调用函数,只能调用一个函数,用指着你调用就比较灵活,可以先后调用不同的函数。
使用
输入2个数,让用户选,如果是 max 就调用 max 函数,如果是 min,就调用 min 函数。
#include <stdio.h>
int main(){
int a,b;
int choose;
int max(int x, int y);
int min(int i, int j);
int (*p)(int ,int);
printf("请输入两个数:\n");
scanf("%d %d",&a,&b);
printf("请输入1 或者 2,运行不同的函数\n");
scanf("%d",&choose);
if(choose==1){
p=max;
}else if (choose==2){
p=min;
}
if(choose==1){
printf("输入的是%d,max:%d\n",choose,(*p)(a,b));
}else{
printf("输入的是%d,min:%d\n",choose,(*p)(a,b));
}
return 0;
}
int max(int x, int y){
return x>y?x:y;
}
int min(int i, int j){
return i>j?j:i;
}
我们看到,虽然我们有两个函数 min 和 max,但是 min 和 max 根据判断结果,用最终调用的指针函数指向它们。
也就是说,最终调用的是指针函数,但是指针函数究竟指向谁,还是根据判断结果进行赋值。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。
评论