指针变量可以指向任何类型的数据,也可以指向一个函数。每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向这个函数入口地址的指针称为函数指针。
1、函数指针基本用法:
int max(int a, int b)
{
return a > b ? a : b;
}
int (*p) (int , int) = max;
int x = 20, y = 30;
int z = p(x, y);
首先定义了一个max函数,函数接受两个int类型的参数并返回其中的最大值。
int (*p) (int , int) = max;
这行代码中定义了一个函数指针p,在定义函数指针时必须指明函数指针所指向函数的返回值和参数列表。代码中的函数指针p所指向的函数的返回值为int类型,参数列表为两个int类型的参数,这与max函数的返回值和参数列表一致,因此可以用函数max初始化函数指针p。
注:函数名等价于函数的入口地址
2、函数指针的定义和初始化
- 括号不能少
在定义时 * p 必须用括号括起来,如果去掉括号代码变为
int *p (int, int) // p是函数而非指针
上面代码中的p不是一个函数指针,而是一个函数名。代码声明了一个函数p,函数返回值类型为int* 类型,并且包括两个int类型的参数。 - 在对函数指针初始化或者赋值的过程中,一定要保证函数的参数个数和类型与函数指针的定义相匹配。
3、函数指针实现简单的四则运算
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int add(int a, int b)
{
return a + b;
}
int minus(int a, int b)
{
return a - b;
}
int multi(int a, int b)
{
return a * b;
}
int divide(int a, int b)
{
return a / b;
}
int calculator(int a, int b, int(*Func)(int, int))
{
return Func(a, b);
}
int main()
{
int a = 40, b = 20;
int res1 = calculator(a, b, add);
printf("a + b = %d\n", res1);
int res2 = calculator(a, b, minus);
printf("a - b = %d\n", res2);
int res3 = calculator(a, b, multi);
printf("a * b = %d\n", res3);
int res4 = calculator(a, b, divide);
printf("a / b = %d\n", res4);
system("pause");
return 0;
}
运行结果:
4、typedef关键字的用法
使用typedef关键字对函数指针类型重定义,并在定义函数指针时使用通过typedef重定义后的类型名。
typedef int (*pFunc) (int, int);
int calculator( int a, int b, pFunc func );