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函數不必做出任何修改。這種方法符合結構化程序設計方法原則。 

 

typedef int (*FUNC)(void);  //聲明FUNC爲指向函數的指針類型,該函數返回整型值

FUNC func; //func爲FUNC類型的指針變量。相當於 int func(){ }

func();  //可以直接調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章