函数指针
我的博客: https://aimerneige.com/2020/11/04/C-Function-Point/
函数指针在大型的 C 语言项目中十分重要,但是学校对它的介绍一带而过,国内一些介绍函数指针的文章十分粗浅甚至存在错误(这里就不点名了),因此博主写了这篇文章介绍函数指针,希望能够帮助一些 C 语言学习者。
文章部分内容翻译引用于 https://www.geeksforgeeks.org/function-pointer-in-c/
函数指针的概念
类似变量,函数也会被分配一段存储空间,这段存储空间的首地址即被称做这个函数的地址。而且函数名表示的就是这个地址。既然是地址,我们就可以定义一个指针变量来存放,这个指针变量就叫做函数指针变量,简称函数指针。
函数指针的定义
下面的语句定义了一个指向函数的指针变量 p。其中 void *
表示返回值,(*p)
表示 p 是一个指针变量, (int, float)
是函数的参数列表。
void *(*p) (int, float);
这样我们就得到了一个指针变量 p,它的类型为 void * (*)(int, float)
所以函数指针的定义方法为:
函数返回类型 (*指针变量名) (函数参数列表);
这里的函数参数列表类似函数声明,只需写出变量类型即可,并不需要定义变量。
即下面的俩种写法等价并且第二种写法中定义的变量并没有任何意义,建议使用第一种写法,不要使用第二种写法。
void *(*p) (int, float);
void *(*p) (int a, float b);
如何对函数指针赋值
int Func(int x); // 函数的声明
int (*p) (int x); // 函数指针的定义
p = &Func; // 函数指针的赋值
p = Func; // 另一种可行的写法
注:对于俩种赋值写法的详细说明见对函数赋值和调用的一些说明
函数指针的调用
#include <stdio.h>
int max(int a, int b); // 函数声明
int main(int argc, char const *argv[])
{
int a = 12;
int b = 32;
int (*p)(int, int); // 函数指针定义
p = &max; // 函数指针赋值
int c = (*p)(a, b); // 函数指针的调用
printf("%d\n", c); // 输出 `32`
return 0;
}
// 函数定义
int max(int a, int b)
{
return a > b ? a : b;
}
函数指针中要注意的一些内容
- 与一般的指针不同,函数指针指向代码而不是数据。通常,一个函数指