转自 https://blog.csdn.net/str999_cn/article/details/78591369
程序是仿照小甲鱼老师的课程写的:https://fishc.com.cn/forum.php
函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数。
不带括号和变量列表的函数名,可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。
定义形式:
类型(*指针变量名)(参数列表);
例如:
int(*p)(int i, int j);
int(*p)(int, int);
p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后与后面 () 结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。
小程序验证一下:
#include<stdio.h>
int add(int, int); //2数相加
int sub(int, int); //2数相减
int calcu(int(*)(int,int), int ,int); //第一个参数是函数指针,决定执行加还是减。
int (*select(char))(int, int); //根据优先级结合性,可以看出这是一个函数select(char),
//返回值是指针*,指针*指向的是一个函数int (int ,int),
//所以这是一个返回值是函数指针的函数。
int add(int num0, int num1)
{
return num0 + num1;
}
int sub(int num0, int num1)
{
return num0 - num1;
}
int calcu(int(*fp)(int ,int), int i, int j)
{
return (*fp)(i, j);
}
int (*select(char op))(int,int) //根据op是'+'还是'-',返回add或sub
{
switch(op)
{
case '+': return add;
case '-': return sub;
}
}
int main()
{
int (*p)(int i, int j), (*n)(int , int ); //声明p、n两个函数指针
p = add;
n = sub;
printf("p(3,4) = %d\n",p(3, 4)); //养成良好编程习惯此处用p(3,4)也可以正确运行,
printf("(*p)(3,4) = %d\n",(*p)(3,4)); //但为了说明函数是通过指针调用的,
printf("add(3,4) = %d\n\n",add(3, 4)); //使用(*p)(3,4)会容易阅读和维护。
printf("p = %p\n",p); //函数指针p和*p地址是相同的。
printf("(*p) = %p\n\n",*p);
printf("calcu(p,3,4) = %d\n", calcu(p,3,4));
printf("calcu(n,3,4) = %d\n\n", calcu(n,3,4));
printf("calcu(select('+'),3,4) = %d\n", calcu((select('+')),3,4));
printf("calcu(select('-'),3,4) = %d\n", calcu((select('-')),3,4));
return 0;
}
运行结果如下:
程序小结:
*1、函数指针p 和(p) 作用一样。
2、函数指针可以做参数。
3、函数指针可以做返回值。