首先区分一下,指针函数和函数指针。
- 指针函数是一个函数,使用指针变量作为函数的返回值,就是指针函数。int *p();
- 函数指针是一个指针,指向一个函数的指针。int (*p)();
再详细说明一下函数指针。
- 指针都是记录地址的嘛,这一点是一样的,所以函数在编译器里面也是用地址表示的,故可以用指针来存放函数的地址,所以在用的时候要加一个*在函数指针的前面。
- 不同于其他指针的是函数指针有函数的属性,比如参数和返回值,函数指针定义:int(*fp)(int,int);该fp指针指向一个返回值为int,参数也为int的一个函数,这样定义一个指针就是函数指针。跟定义一个函数很类似!*fp可以看作一个函数名,fp是函数名的地址。
接下来用一个代码案例说明一切,注释详细,耐心看完看懂,相信会有所获的。
#include<stdio.h>
int add(int,int);//小知识:声明函数的时候函数的参数名可以省略,但是参数类型(int,char,等...)和函数名不可以省略。
int sub(int,int);
int calc(int (*)(int,int),int,int);//该函数由一个函数指针类型作为参数和两个int类型作为参数,一共三个参数
int (*select(char))(int,int);//声明一个返回值为 函数指针类型 的函数,该函数本身的传入参数为char型,因为一个函数有两部分,一是返回值类型,二是传入的参数类型
int add(int num1,int num2) //实现加法
{
return num1+num2;
}
int sub(int num1,int num2) //实现减法
{
return num1-num2;
}
int (*select(char op))(int,int)//利用用户的输入的'+'或者'-'来判断应该用哪个运算法则,仅仅是判断应该用哪个法则,不做计算!
{
switch(op)
{
case'+':return add;//add是一个函数、地址。
case'-':return sub;
}
}
int calc(int(*fp)(int,int),int num1,int num2)//传入刚刚判断好要用的运算法则和要计算的值,并嵌套调用运算法则的函数进行计算。
{
return (*fp)(num1,num2); //(*fp)fp只是函数的地址,因为函数指针是存地址的,所以*fp才指函数,然后传入该函数的参数
}
int main()
{
int num1,num2;
char op;
int (*fp)(int ,int);//定义一个函数指针 该指针指向的函数返回值为int,参数有两,都为int类型
printf("请输入一个式子(如 1+3):");
scanf("%d%c%d",&num1,&op,&num2);
fp=select(op);//记录利用select函数选好的运算法则 select函数返回的是一个函数,但是函数可以由地址表示,当然可以传入一个函数指针类型里面
printf("%d %c %d = %d",num1,op,num2,calc(fp,num1,num2));//用calc函数计算结果。
return 0;
}