新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > C語(yǔ)言的那些小秘密之函數(shù)指針

        C語(yǔ)言的那些小秘密之函數(shù)指針

        作者: 時(shí)間:2015-03-04 來(lái)源:網(wǎng)絡(luò) 收藏

          我們經(jīng)常會(huì)聽(tīng)到這樣的說(shuō)法,不懂得就不是真正的高手。我們不管這句話對(duì)與否,但是它都從側(cè)面反應(yīng)出了的重要性,所以我們還是有必要掌握對(duì)的使用。先來(lái)看看函數(shù)指針的定義吧。

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

          函數(shù)是由執(zhí)行語(yǔ)句組成的指令序列或者代碼,這些代碼的有序集合根據(jù)其大小被分配到一定的內(nèi)存空間中,這一片內(nèi)存空間的起始地址就成為函數(shù)的地址,不同的函數(shù)有不同的函數(shù)地址,編譯器通過(guò)函數(shù)名來(lái)索引函數(shù)的入口地址,為了方便操作類(lèi)型屬性相同的函數(shù),c/c++引入了函數(shù)指針,函數(shù)指針就是指向代碼入口地址的指針,是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)該是指針變量,只不過(guò)該指針變量指向函數(shù)。這正如用指針變量可指向整形變量、字符型、數(shù)組一樣,這里是指向函數(shù)。C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂贰S辛酥赶蚝瘮?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類(lèi)型變量一樣,在這些概念上是一致的。函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。

          函數(shù)指針的聲明方法為:

          數(shù)據(jù)類(lèi)型標(biāo)志符 (指針變量名) (形參列表);

          “函數(shù)類(lèi)型”說(shuō)明函數(shù)的返回類(lèi)型,由于“()”的優(yōu)先級(jí)高于“*”,所以指針變量名外的括號(hào)必不可少,后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。例如:

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

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

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

          賦值時(shí)函數(shù)function不帶括號(hào),也不帶參數(shù),由于function代表函數(shù)的首地址,因此經(jīng)過(guò)賦值以后,指針f就指向函數(shù)function(int x,int y);的代碼的首地址。

          下面的程序說(shuō)明了函數(shù)指針調(diào)用函數(shù)的方法:

          例一、

          #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));

          }

          注意:以上代碼的紅色部分我們將會(huì)在接下來(lái)的代碼分析部分進(jìn)行講解,讀者也可以思考下如果運(yùn)行注釋部分,結(jié)果是否還是正確的呢?

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

          函數(shù)括號(hào)中的形參可有可無(wú),視情況而定,不過(guò),在某些編譯器中這是不能通過(guò)的。這個(gè)例子的補(bǔ)充如下。

          1.定義函數(shù)指針類(lèi)型:

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

          2.申明變量,賦值:

          fun_ptr max_func=max;

          也就是說(shuō),賦給函數(shù)指針的函數(shù)應(yīng)該和函數(shù)指針?biāo)傅暮瘮?shù)原型是一致的。

          例二、

          #include

          void FileFunc()

          {

          printf("FileFuncn");

          }

          void EditFunc()

          {

          printf("EditFuncn");

          }

          void main()

          {

          typedef void (*funcp)();

          funcp pfun= FileFunc;

          pfun();

          pfun = EditFunc;

          pfun();

          }

          看了上面兩段代碼,應(yīng)該都知道如何用函數(shù)指針來(lái)調(diào)用函數(shù)了,但是我們剛剛在上面的描述中留下過(guò)一個(gè)問(wèn)題,就是運(yùn)行注釋部分f=&max;結(jié)果是否還是正確的呢?下面我就給出上面兩個(gè)運(yùn)行結(jié)果的對(duì)別,然后來(lái)分析下原因。

        c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


        c++相關(guān)文章:c++教程



        上一頁(yè) 1 2 下一頁(yè)

        關(guān)鍵詞: C語(yǔ)言 函數(shù) 指針

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 理塘县| 井冈山市| 红安县| 郓城县| 章丘市| 吉安县| 南投市| 武胜县| 潞城市| 腾冲县| 崇礼县| 射阳县| 莱西市| 湖北省| 安泽县| 泰安市| 登封市| 龙海市| 建瓯市| 广饶县| 安庆市| 北安市| 阳泉市| 阿瓦提县| 同德县| 仁怀市| 长沙县| 安图县| 满城县| 罗甸县| 淮阳县| 凤城市| 哈巴河县| 米易县| 盖州市| 林州市| 蓝田县| 建瓯市| 阳东县| 本溪| 育儿|