C语言 指向函数的指针

        函数指针:如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针

        可以定义一个纸箱函数的指针变量,用来存放一个函数的起始地址,这就意味着次指针变量指向该函数。例如:

int (* p)(int, int);    //p的类型为int(*)(int, int)

        定义p是一个指向函数的指针变量,它可以指向函数的类型为整形且有两个整型参数的函数。p的类型为int(*)(int, int)

定义指向函数的指针变量的一般形式为: 类型名 (* 指针变量名) (函数参数表列);
        如“int (*p)(int, int);”这里的 “类型名”是指函数返回值的类型

用指向函数的指针做函数参数:

        指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数。

        指向函数的指针可作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。它的原理可以简述如下:有一个函数(假设函数名fun),它有两个形参(x1 和 x2),定义x1和x2为指向函数的指针变量。在调用哈数fun时,参数为两个函数名f1和f2,给形参传递的是函数f1和f2的入口地址。这样在函数fun中就可以调用f1和f2函数了。例如:

//实参函数名      f1              f2
void fun(int(*x1)(int), int(*x2)(int, int))    //定义fun函数,形参是指向函数的指针变量  
{  
    int a, b, i = 3, j = 5;  
    a = (*x1)(i);                                //调用f1函数,i是实参  
    b = (*x2)(i, j);                            //调用f2函数,i,j是实参  
}
        在fun函数中声明形参x1和x2为指向函数温度指针变量,x1指向的函数有一个整型形参,x2指向的函数有两个整型形参。i ,j是调用f1和f2函数时所要求的实参。函数fun的形参x1和x2(指针变量)在函数fun未被调用时并不占内存单元,也不指向任何函数。在主函数调用fun函数时,把实参f1和f2的入口地址传给形参指针x1和x2,使x1和x2指向函数f1和 f2。这时,在函数fun中,用*x1和*x2就可以调用函数f1和f2。(*x1)(i)就相当于f1(i),(*x2)(i, j)就相当于f2(i, j)。


        主要用于需要调用的函数不固定时,这次调用f1 和 f2,而下次要调用f3和f4。这时用指针变量就比较方便了。只要每次调用调用fun函数时给出不同的函数名作为实参即可,fun函数不必做出任何修改。这种方法符合结构化程序设计方法原则。


猜你喜欢

转载自blog.csdn.net/hola_ya/article/details/80604430