函數指標 和 函數指標數組 和 函數指標數組

來源:互聯網
上載者:User

//先看一些函數指標的例子(吸納了網上兄弟的方法)

#include <stdio.h><br />void MyFun(int x); //這個申明也可寫成:void MyFun( int );<br />void (*FunP)(int ); //也可申明成void(*FunP)(int x),但習慣上一般不這樣。 </p><p>void MyFun(int x) //這裡定義一個MyFun函數<br />{<br /> printf("%d/n",x);<br />} </p><p>int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這是直接調用MyFun函數<br /> Funp=&MyFun; //將MyFun函數的地址賦給FunP變數<br /> (*FunP)(20); //這是通過函數指標變數FunP來調用MyFun函數的。<br />}<br />............................<br />int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這裡是調用MyFun(10);函數<br /> FunP=&MyFun; //將MyFun函數的地址賦給FunP變數<br /> FunP(20); //這是通過函數指標變數來調用MyFun函數的。 </p><p> return 0;<br />}<br />................................ </p><p>int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這是直接調用MyFun函數<br /> FunP=MyFun; //將MyFun函數的地址賦給FunP變數<br /> FunP(20); //這是通過函數指標變數FunP來調用MyFun函數的。<br />} </p><p>........................................ </p><p>int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這裡是調用MyFun(10);函數<br /> FunP=MyFun; //將MyFun函數的地址賦給FunP變數<br /> (*FunP)(20); //這是通過函數指標變數來調用MyFun函數的。<br /> return 0;<br />}<br />.................<br />int main(int argc, char* argv[])<br />{<br /> (*MyFun)(10); //看,函數名MyFun也可以有這樣的調用格式 </p><p> return 0;<br />} </p><p>

     

    函式宣告一般是這樣int fun(int,double);對應函數指標(pointer to function)的聲明
    是這樣:
     

    int (*pf)(int,double),你必須習慣。可以這樣使用:
    pf = &fun;//賦值(assignment)操作

    (*pf)(5, 8.9);//函數叫用作業

    也請注意,C語言本身提供了一種簡寫方式如下:
    pf = fun;// 賦值(assignment)操作
    pf(5, 8.9);// 函數叫用作業
    不過我本人不是很喜歡這種簡寫,它對初學者帶來了比較多的迷惑。

    ............................

    1. 其實,MyFun的函數名與FunP函數指標都是函數指標。MyFun函數名是一個函數指標常量,而FunP是一個函數數指標變數,這是它們的關係。

    2. 但函數名調用如果都得如(*MyFun)(10);這樣,那書寫與讀起來都是不方便和不習慣的。所以C語言的設計者們才會設計成又可允許MyFun(10);這種形式地調用(這樣方便多了並與數學中的函數形式一樣,不是嗎?)。

    3. 為統一起見,FunP函數指標變數也可以FunP(10)的形式來調用。

    4. 賦值時,即可FunP=&MyFun形式,也可FunP=MyFun。

    請這樣理解吧!這可是有助於你對函數指標的應用嘍!

    最後補充說明一點:在函數的申明處:

    void MyFun(int );  //不能寫成void (*MyFun)(int )。
    void (*FunP)(int );//不能寫成void FunP(int )。

    (請看注釋)這一點是要注意的

    另外可以用typedef來類取別名 比如 typedef void(*FunType)(int)
    //這樣只是定義一個函數指標類型

     

     

    函數指標數組:

    void (*fun[256])(void);
    fun[0] = function0;
    ……
    fun[255] = function255;//切忌fun[255] = function255() ,因function255() 是函數傳回值了.

     

    調用如下:

    __int8 nStreamType = buffer[0];
        (*fun[nStreamType])();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.