函数指针系列:用指向函数的指针作函数参数

指向函数的指针变量的用途之一就是可以把该函数的入口地址作为参数传递到其它函数(传递给形参)。
原理举例:
有一个函数名为fun的函数,它有两个形参x1和x2,并且定义x1和x2为指向函数的指针变量。在调用fun函数时,实参的两个函数名为f1和f2,这样给fun形参传递的就是f1和f2函数的入口地址。如此在fun函数中就可以调用f1和f2函数。下面假设x1对应的实参函数为f1,x2对应的实参函数为f2:

int fun(int(*x1)(int,char),int(*x2)(int,int))
{
  int a=1,b=2,c=3int result1,result2=0char d='a';
  result1=(*x1)(a,d);   //调用f1函数,a,b是实参
  result2=(*x2)(b,c);   //调用f2函数,b,c是实参
}

在fun函数中,声明的形参x1和x2是指向函数的指针变量,x1指向的f1函数有一个int型和一个char型形参,x2指向的f2函数有两个int型形参。
a,b,c,d是调用f1和f2函数时所要求的实参。在fun函数没有被调用的时候,该函数的指针变量x1和x2并不占用内存空间,也不指向任何函数。在fun函数被调用时,此时函数f1和f2的入口地址传送到了fun函数形参x1和x2(即x1和x2指向函数f1和f2),所以通过* x1和 * x2就可以调用函数f1和函数f2, ( * x1)(a,d)相当于f1(a,b),( * x2)(b,c)相当于f2(b,c)。
用指向函数的指针作函数参数的方法对于要调用“不固定函数”的函数是非常方便的。
举例:

#include
#include 

int Max(int a,int b);
int Min(int a,int b);
int Sum(int a,int b);


void fun(int a,int b,int(*p)(int,int));

int main(void)
{
    int a,b;
    int n=0;

    printf("输入两个整数:\n");
    scanf("%d %d",&a,&b);

    printf("请用数字选择要进行的运算:1求最大,2求最小,3求和\n");
    scanf("%d",&n);

    if(n==1)
        fun(a,b,Max);
    else if(n==2)
        fun(a,b,Min);
    else if(n==3)
        fun(a,b,Sum);
    else
        printf("输入选择有误!\n");

    system("pause");
    return 0;
}

void fun(int x,int y,int(*p)(int,int))
{
    int result;
    result=(*p)(x,y);
    printf("%d\n",result);  
}

int Max(int x,int y)
{
    int z;
    if(x>y)
        z=x;
    else 
        z=y;
    printf("max=");
    return z;
}


int Min(int x,int y)
{
    int z;
    if(x<y)
        z=x;
    else 
        z=y;
    printf("min=");
    return z;
}

int Sum(int x,int y)
{
    int z;
    z=x+y;
    printf("sum=");
    return z;
}

运行结果:
比较5和6,选择1,调用Max函数
这里写图片描述

比较5和6,选择2,调用Min函数
这里写图片描述

比较5和6,选择3,调用Sum函数
这里写图片描述

在定义fun函数时,在函数首部使用“int(*p)(int,int)”声明形参p是指向函数的指针,该函数是整形函数,有两个整形实参。不论是调用Max,Min,Sum函数fun改变的只是实参函数名而已,这就增加了函数使用的灵活性。

你可能感兴趣的:(#,C/C++,函数,指针)