函数指针:是指向函数的指针变量,本质上是一个指针变量,表示的是一个指针,它指向的是一个函数。
我们用栗子给大家说明:
(1)函数指针
//函数指针
//转移表
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
if (b != 0)
return a / b;
}
int main()
{
add(2, 5);
int(*p)(int ,int);
p = add;
printf("%d\n", p(4, 5));
p = sub;
printf("%d\n", p(4, 5))
}
可以看到笔者定义了+-*/四个函数。用函数指针的方式调用函数
在这里先引入一个概念:
函数名代表的是函数的入口地址,所以可以用指针指向
函数指针的定义方式如下:
指针函数指向的函数返回值类型 指针函数名 指针指向的函数的参数类型
int(*p)(int ,int);//函数指针
p=add;将指针指向函数名
接下来的调用就和原来调用函数一样。
(2)函数指针数组
#include<stdio.h>
#include<stdlib.h>
//函数指针
//转移表
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
if (b != 0)
return a / b;
}
int main()
{
int(*p[])(int, int) = { add,sub,mul,Div };//函数指针数组
int n = sizeof(p) / sizeof(p[0]);
for (int i = 0; i < n; ++i)
{
printf("%d\n", p[i](4, 5));
}
test(4, 5, add);//函数指针作为函数的参数
system("pause");
return 0;
}
可以看到函数指针数组的本质是个数组,怎么判断请看我的另一篇博客https://blog.csdn.net/weixin_43447989/article/details/90216974
函数指针数组的定义是:指向的函数的返回值各类型 指针数组名 指向的函数的参数
初始化方式如int(*p[])(int, int) = { add,sub,mul,Div }
元素都是相同的格式。
(3)函数指针作为函数的返回值出现
int add(int a, int b)
{
return a + b;
}
//fn函数的返回值是个指针(指向函数(int xx(int ,int))的指针)
int(*fn(int n))(int, int)//此处的n没什么用
{
printf("fn:n=%d\n", n);
return add;//int *p(int ,int)
}
int main()
{
int value = fn(100)(3, 9);
printf("%d\n", value);
system("pause");
return 0;
}