C语言中的指针-函数指针和函数指针变量调用函数-学习笔记-35

引入

前面,我们学习了,将指针指向变量、指向数组、指向字符数组,今天我们要引入一个新的概念,指针指向函数。

什么是函数指针?

如果程序中定义了一个函数,那么在编译时,编译系统会为函数代码分配一段存储空间,我们称这段存储空间的起始地址,称为这个函数的指针

所以,我们在捋顺一下:

指针指向变量:变量的地址
指针指向数组:数组首元素的地址
指针指向多维数组:数组首行元素的地址
指针指向字符数组:字符数组的首元素地址
指针指向函数:函数存储空间的起始地址

如何定义一个函数指针

函数指针,意味着这个指针指向该函数:

1
2
int (*p)(int,int);
// 我们定义了一个指向函数的指针 p,该函数返回值为整型,有两个整型参数

如何用函数指针变量调用函数

我们知道,调用一个函数,直接用函数名调用即可。现在,我们学习了指向函数的指针变量,我们也可以使用指针变量来调用函数了。

举个例子

求两个变量之中的较大者,并且返回较大者。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
int max(int a, int b);
int num_a=5,num_b=10;
printf("最大的是:%d\n",max(num_a,num_b));
return 0;
}
int max(int a, int b){
int big;
big=a>b?a:b;
return big;
}

上面是一个很简单的比大小的程序,我们通过 max 这个函数名来调用了 max 函数。我们接着用指针变量方访问这个 max 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(){
int max(int, int);
int num_a=5,num_b=10;
int (*p)(int,int);
p=max;
printf("最大的是:%d\n",(*p)(num_a,num_b));
return 0;
}
int max(int a,int b){
int big;
big=a>b?a:b;
return big;
}

我们看到,max 函数本身没有变化,变化的是在 main 函数中主调的时候,不是通过函数名调用,而是通过指针变量的方式调用,不过在调用之前,指针变量定义也需要注意:

1
2
int max (int a,int b)
int (*p)(int,int)

上面这两个声明必须相同,也就是指针的返回类型和参数类型必须和指向的函数相同。

1
2
3
c=(*p)(a,b);
//等价于
c=max(a,b);

不要将(p)(int a, int b)写成 p (Int a,int b),因为这样根据优先级,就成了 *(p(int a , int b))这就成了声明一个 p 函数了。

无论是变量、数组还是函数,传递给指针的只有地址,但是在函数中,我们不能通过移动指针来表示下一条指令。*(p+1)这是不对的!

尾巴

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


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