挑戰(zhàn)30天C++入門極限:C/C++中函數(shù)指針的含義

字號:

函數(shù)存放在內(nèi)存的代碼區(qū)域內(nèi),它們同樣有地址,我們?nèi)绾文塬@得函數(shù)的地址呢?
    如果我們有一個int test(int a)的函數(shù),那么,它的地址就是函數(shù)的名字,這一點如同數(shù)組一樣,數(shù)組的名字就是數(shù)組的起始地址。
    定義一個指向函數(shù)的指針用如下的形式,以上面的test()為例:
    int (*fp)(int a);//這里就定義了一個指向函數(shù)的指針
    函數(shù)指針不能絕對不能指向不同類型,或者是帶不同形參的函數(shù),在定義函數(shù)指針的時候我們很容易犯如下的錯誤。
    int *fp(int a);//這里是錯誤的,因為按照結(jié)合性和優(yōu)先級來看就是先和()結(jié)合,然后變成了一個返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點尤其需要注意!
    下面我們來看一個具體的例子:
    #include
    #include
    using namespace std;
    int test(int a);
    void main(int argc,char* argv[])
    {
     cout<     int (*fp)(int a);
     fp=test;//將函數(shù)test的地址賦給函數(shù)學(xué)指針fp
     cout<    //上面的輸出fp(5),這是標準c++的寫法,(*fp)(10)這是兼容c語言的標準寫法,兩種同意,但注意區(qū)分,避免寫的程序產(chǎn)生移植性問題!
     cin.get();
    }
    int test(int a)
    {
     return a;
    }
    typedef定義可以簡化函數(shù)指針的定義,在定義一個的時候感覺不出來,但定義多了就知道方便了,上面的代碼改寫成如下的形式:
    #include
    #include
    using namespace std;
    int test(int a);
    void main(int argc,char* argv[])
    {
     cout<     typedef int (*fp)(int a);//注意,這里不是生命函數(shù)指針,而是定義一個函數(shù)指針的類型,這個類型是自己定義的,類型名為fp
     fp fpi;//這里利用自己定義的類型名fp定義了一個fpi的函數(shù)指針!
     fpi=test;
     cout<     cin.get();
    }
    int test(int a)
    {
     return a;
    }
    函數(shù)指針同樣是可以作為參數(shù)傳遞給函數(shù)的,下面我們看個例子,仔細閱讀你將會發(fā)現(xiàn)它的用處,稍加推理可以很方便我們進行一些復(fù)雜的編程工作。
    //-------------------該例以上一個例子作為基礎(chǔ)稍加了修改-----------------------------
    #include
    #include
    using namespace std;
    int test(int);
    int test2(int (*ra)(int),int);
    void main(int argc,char* argv[])
    {
     cout<     typedef int (*fp)(int);
     fp fpi;
     fpi=test;//fpi賦予test 函數(shù)的內(nèi)存地址
     cout<     cin.get();
    }
    int test(int a)
    {
     return a-1;
    }
    int test2(int (*ra)(int),int b)//這里定義了一個名字為ra的函數(shù)指針
    {
     int c=ra(10)+b;//在調(diào)用之后,ra已經(jīng)指向fpi所指向的函數(shù)地址即test函數(shù)
     return c;
    }
    利用函數(shù)指針,我們可以構(gòu)成指針數(shù)組,更明確點的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。
    #include
    #include
    using