C语言中的指针-定义和使用指向函数的指针变量-学习笔记-36

引子

上一节,我们通过例子知道,何如定义一个函数指针,并且把这个指针指向函数,现在我们进一步看看该如何定义和使用指向函数的指针变量。

定义

定义指向函数的指针变量一般形式为:

类型名 (* 指针变量名)(函数参数表列)

1
int (*p)(int,int);

注意,指针变量名必须用括号包起来。类型名,是指函数返回值的类型。

注意

  • 定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数。三点要一致,返回值类型和参数数量、参数类型,只有定义指针变量时这三点和需要指向的函数相同,才能指向该函数。我们可以将一个指针先后指向同类型的不同函数。
  • 如果要用指针变量调用函数,必须将指针与函数相连接,也就是将指针变量指向该函数。
1
2
3
int max(int a, int b);
int ( *p )( int , int );
p=max; //这里就是将 max 的入口地址赋值给 p,p 指向了该函数
  • 在将指针变量指向函数的时候,不必包含函数参数,因为这里没有虚实结合的过程,并且传递的是函数的入口地址
  • 在使用指针调用函数的时候,非常简单,只要把函数名替换成(*指针名)。
1
2
3
4
p=max;
// 下面两个是等价的
max( a , b);
( * p )( a , b );
  • 对指向函数的指针,不能进行算术运算,例如加减,加加减减都是无意义的,因为不能移动指针到下一个函数。
  • 用函数名调用函数,只能调用一个函数,用指着你调用就比较灵活,可以先后调用不同的函数。

使用

输入2个数,让用户选,如果是 max 就调用 max 函数,如果是 min,就调用 min 函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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 根据判断结果,用最终调用的指针函数指向它们。
也就是说,最终调用的是指针函数,但是指针函数究竟指向谁,还是根据判断结果进行赋值。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!