【时时三省】(C语言基础)用指向函数的指针作函数参数
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
指向函数的指针变量的一个重要用途是把函数的入口地址作为参数传递到其他函数。指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。它的原理可以简述如下:有一个函数(假设函数名为fun),它有两个形参( x1和x2 ),定义x1和x2为指向函数的指针变量。在调用函数fun时,实参为两个函数名f1和f2,给形参传递的是函数f1和f2的入口地址。这样在函数fun中就可以调用f1和f2函数了。
在fun函数中声明形参x1和x2为指向函数的指针变量, xl指向的函数有一个整型形参,x2指向的函数有两个整型形参。i和j是调用fl和f2函数时所要求的实参。函数fun的形参xl和x2(指针变量)在函数fun未被调用时并不占内存单元,也不指向任何函数。在主函数调用fun函数时,把实参函数f1和f2的入口地址传给形参指针变量x1和x2,使x1和x2指向函数f1和f2。这时,在函数fun中,用* x1和* x2就可以调用函图fl和f2。( * xl ) ( i )就相当于fl ( i ) , ( * x2 ) ( i , i )就相当于f2 ( i , j )。
有人可能会问,既然在fun函数中要调用f1和f2函数,为什么不直接调用f1和f2而要用函数指针变量呢?何必绕这样一个圈子呢?的确,如果只是用到fl和f2函数,完全可以在fun函数中直接调用fl和f2,而不必设指针变量x1和x2。但是,如果在每次调用fun函数时,要调用的函数不是固定的,这次调用fl和f2,而下次要调用f3和f4,第3次要调用的是f5和f6。这时,用指针变量就比较方便了。只要在每次调用fun函数时给出不同的函数名作为实参即可,fun函数不必做任何修改。这种方法是符合结构化程序设计方法原则下面通过一个简单的例子来说明这种方法的应用。
例题1:
两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中的大者,输入2,就给出a和b中的小者,输入3,则求a与b之和。
编写程序:
运行结果:
选择1:
选择2:
选择3:
在定义fun函数时,在函数首部用“int ( * p ) ( int,int )”声明形参p是指向函数的指针,该函数是整型函数,有两个整型形参。max,min和add是已定义的3个函数,分别用来实现求大数、求小数和求和的功能。
当输入1时( n = 1 ),调用fun函数,除了将a和b作为实参,将两个整数传给fun函数的形参x和y外,还将函数名max作为实参将其入口地址传送给fun函数中的形参p ( p是指向函数的指针变量)。这时,fun函数中的( *p ) ( x,y )相当于max ( x , y ),调用max ( x,y )就输出a和b中的大者。
若输入2 ( n = 2 ),调用fun函数时,以函数名min作实参,此时fun函数的形参ρ指向函数min,在fun函数中的函数调用( *p ) ( x,y )相当于min ( x,y )。调用min ( x,y )就输出a和b中的小者。同理,若n = 3,调用fun函数时,以函数名add作实参,fun函数中的( *p ) ( x,y )相当于add ( x,y ),调用add ( x,y ),就输出a和b之和。
从本例可以清楚地看到,不论调用max,min或add,函数fun都没有改变,只是改变实参函数名而已。在fun函数中输出result,由于在不同的情况下调用了不同的函数,因此result的值是不同的。这就增加了函数使用的灵活性。可以编写一个通用的函数来实现各种专用的功能。需要注意的是,对作为实参的函数(如max,min,add),应在主调函数中用函数原型作函数声明。