1.概念:函数指针是指向函数的指针变量,函数指针本身应为指针变量,且指针变量指向函数,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,有了指向函数的指针变量之后,可用该指针变量调用函数,函数指针有2个用途,调用函数和做函数参数。
2.声明:返回类型(*指针变量名)([形参列表])
(1):“(指针变量名)”中的括号不能省略,括号改变了运算符的优先级也将发生改变,若省略整体则成为一个函数声明,声明了一个返回的数据类型是指针的函数,后面的形参列表表示指针变量所指向的函数所带的参数列表
(2):Eg:int (*lin) (int ,int ) /*声明一个函数指针*/
int add(int x,int y)/*函数声明*/
int (*lin) (int ,int)=Add/*将函数指针初始化*/
int(*lin)(2,3)/*函数指针用法,且*不参与运算,可省略*/
3.代码例1:( *( void ( * ) ( ) ) 0 ) ( )
(1)void ( * )( ) 是一个函数指针类型,
(2)( void ( * ) ( ) ) 作用是将0强制类型转换成void ( * )( )类型
(3)整体意思:将0强制转换为一个函数指针类型,0地址处放一个返回类型是void,无参的一个函数,将调用0地址处的子例程.
代码例2:void ( * lin ( int ,void( * ) ( int ) ) ) int( );//这是一个函数声明
void ( * ) ( int )是一个函数指针,lin ( int,void ( * ) ( int ) )是一个lin函数,lin函数的参数第一个为int类型,第二个为void ( * ) ( int )的函数指针类型,且lin函数的返回值类型也是void ( * ) ( int )类型
typedef void ( *pf ) ( int ) /*将void ( * ) ( int )重新起个名字叫pf
代码可简化为:pf lin ( int ,pf )
4.代码使用例题(写一个整型计算器):
#include<stdio.h>
int add(int a, int b)
{
int c = a + b;
return c;
}
int sut(int a, int b)
{
int c = a - b;
return c;
}
int rid(int a, int b)
{
int c = a * b;
return c;
}
int div(int a, int b)
{
int c = a / b;
return c;
}
void menu()
{
printf("************** **************\n");
printf("************** **************\n");
printf("************** calculadora cientiflca **************\n");
printf("************** 1.add 2.sut **************\n");
printf("************** 3.rid 4.div **************\n");
printf("************** 0.out **************\n");
printf("************** **************\n");
printf("************** **************\n");
}
int main()
{
int input = 0;
int x = 0, y = 0;
int (*pdf[])(int, int) = { 0,add,sut,rid,div };//初始化函数指针数组
do
{
menu();//打印菜单
printf("请输入选项:");
scanf("%d", &input);
if (input == 0)
{
printf("退出成功\n");
break;
}
else if (input > 0 && input <= 4)
{
printf("请输入需要计算的两个数:");
scanf("%d %d", &x, &y);
int ret = pdf[input](x, y);//调用函数指针数组
printf("ret=%d\n", ret);
}
else
{
printf("输入错误,请重新选择\n");
}
} while (input);
return 0;
}