• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 牛人業話 > C語言的那些小秘密之函數指針

    C語言的那些小秘密之函數指針

    作者: 時間:2015-03-04 來源:網絡 收藏

      我們經常會聽到這樣的說法,不懂得就不是真正的高手。我們不管這句話對與否,但是它都從側面反應出了的重要性,所以我們還是有必要掌握對的使用。先來看看函數指針的定義吧。

    本文引用地址:http://www.czjhyjcfj.com/article/270442.htm

      函數是由執行語句組成的指令序列或者代碼,這些代碼的有序集合根據其大小被分配到一定的內存空間中,這一片內存空間的起始地址就成為函數的地址,不同的函數有不同的函數地址,編譯器通過函數名來索引函數的入口地址,為了方便操作類型屬性相同的函數,c/c++引入了函數指針,函數指針就是指向代碼入口地址的指針,是指向函數的指針變量。 因而“函數指針”本身首先應該是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整形變量、字符型、數組一樣,這里是指向函數。C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是一致的。函數指針有兩個用途:調用函數和做函數的參數。

      函數指針的聲明方法為:

      數據類型標志符 (指針變量名) (形參列表);

      “函數類型”說明函數的返回類型,由于“()”的優先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。例如:

      int function(int x,int y); /* 聲明一個函數 */

      int (*f) (int x,int y); /* 聲明一個函數指針 */

      f=function; /* 將function函數的首地址賦給指針f */

      賦值時函數function不帶括號,也不帶參數,由于function代表函數的首地址,因此經過賦值以后,指針f就指向函數function(int x,int y);的代碼的首地址。

      下面的程序說明了函數指針調用函數的方法:

      例一、

      #include

      int max ( int x, int y){ return x>y?x:y;}

      int min ( int x, int y){ return x

      void main ()

      { int ( *f ) ( int x, int y)=max;

      //f=&max;

      printf ( "%d,%dt", max (2,6), (f)(5,4));

      f=min;

      printf (" %d,%dt" , min (2,6), (f)(5,4));

      }

      注意:以上代碼的紅色部分我們將會在接下來的代碼分析部分進行講解,讀者也可以思考下如果運行注釋部分,結果是否還是正確的呢?

      f是指向函數的指針變量,所以可把函數max()賦給f作為f的值,即把max()的入口地址賦給f,以后就可以用f來調用該函數,實際上f和max都指向同一個入口地址,不同就是f是一個指針變量,不像函數名稱那樣是死的,它可以指向任何函數,就看你想怎么做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而后用指針變量調用它,因此可以先后指向不同的函數。不過注意,指向函數的指針變量沒有++和--運算,用時要小心。

      函數括號中的形參可有可無,視情況而定,不過,在某些編譯器中這是不能通過的。這個例子的補充如下。

      1.定義函數指針類型:

      typedef int (*fun_ptr)(int,int);

      2.申明變量,賦值:

      fun_ptr max_func=max;

      也就是說,賦給函數指針的函數應該和函數指針所指的函數原型是一致的。

      例二、

      #include

      void FileFunc()

      {

      printf("FileFuncn");

      }

      void EditFunc()

      {

      printf("EditFuncn");

      }

      void main()

      {

      typedef void (*funcp)();

      funcp pfun= FileFunc;

      pfun();

      pfun = EditFunc;

      pfun();

      }

      看了上面兩段代碼,應該都知道如何用函數指針來調用函數了,但是我們剛剛在上面的描述中留下過一個問題,就是運行注釋部分f=&max;結果是否還是正確的呢?下面我就給出上面兩個運行結果的對別,然后來分析下原因。

    c語言相關文章:c語言教程


    c++相關文章:c++教程



    上一頁 1 2 下一頁

    關鍵詞: C語言 函數 指針

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 抚顺市| 金沙县| 沅江市| 青海省| 神农架林区| 黄浦区| 绵阳市| 咸宁市| 百色市| 勃利县| 峨眉山市| 荥经县| 花垣县| 天气| 衡东县| 卫辉市| 翼城县| 黄浦区| 墨玉县| 呼和浩特市| 新源县| 和平区| 千阳县| 平安县| 东源县| 浦北县| 资兴市| 红安县| 普洱| 涪陵区| 通道| 平安县| 阳朔县| 崇明县| 醴陵市| 新蔡县| 临漳县| 呼伦贝尔市| 会理县| 兰考县| 长葛市|