• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            人生亦編程

            --Programmable Life
            posts - 86, comments - 43, trackbacks - 0, articles - 7

            指針函數和函數指針

            Posted on 2006-07-23 13:52 人生亦編程 閱讀(187) 評論(0)  編輯 收藏 引用 所屬分類: 程序
            #include?

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

            void ?main()?
            {?
            ????
            int ?( * ptr)();?
            ????
            int ?a,b,c;?
            ????ptr
            = max;?
            ????scanf(
            " %d,%d " , & a, & b);?
            ????c
            = ( * ptr)(a,b);?
            ????printf(
            " a=%d,b=%d,max=%d " ,a,b,c);?
            }
            ?
            指針函數和函數指針有什么區別

            1,這兩個概念都是簡稱,指針函數是指帶指針的函數,即本質是一個函數。我們知道函數都又返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。其定義格式如下所示:

            返回類型標識符 *返回名稱(形式參數表)
            { 函數體 }

            返回類型可以是任何基本類型和復合類型。返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當于一個指針。比如函數返回一個整型值,實際上也相當于返回一個指針變量的值,不過這時的變量是函數本身而已,而整個函數相當于一個“變量”。例如下面一個返回指針函數的例子:

            #include?

            float?*find();?
            main()?
            {?
            ????
            static?float?score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};?
            ????
            float?*p;?
            ????
            int?i,m;?
            ????printf(
            "Enter?the?number?to?be?found:");?
            ????scanf(
            "%d",&m);?
            ????printf(
            "the?score?of?NO.%d?are:\n",m);?
            ????p
            =find(score,m);?
            ????
            for(i=0;i<4;i++)?
            ????????printf(
            "%5.2f\t",*(p+i));?
            }
            ?

            float?*find(float(*pionter)[4],int?n)/*定義指針函數*/?
            {?
            ????
            float?*pt;?
            ????pt
            =*(pionter+n);?
            ????
            return(pt);?
            }
            ?

            學生學號從0號算起,函數find()被定義為指針函數,起形參pointer是指針指向包含4個元素的一維數組的指針變量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0個元素。pt是一個指針變量,它指向浮點型變量。main()函數中調用find()函數,將score數組的首地址傳給pointer.

            2,“函數指針”是指向函數的指針變量,因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上一致的。函數指針有兩個用途:調用函數和做函數的參數。函數指針不能絕對不能指向不同類型,或者是帶不同形參的函數,在定義函數指針的時候我們很容易犯如下的錯誤。

            int *fp(int a);//這里是錯誤的,因為按照結合性和優先級來看就是先和()結合,然后變成了一個返回整形指針的函數了,而不是函數指針,這一點尤其需要注意!

            函數指針的說明方法為:
            數據類型標志符 (*指針變量名)(參數);注:函數括號中的參數可有可無,視情況而定。
            下面的程序說明了函數指針調用函數的方法:


            ptr是指向函數的指針變量,所以可把函數max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以后就可以用ptr來調用該函數,實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變量,不像函數名稱那樣是死的,它可以指向任何函數,就看你像怎么做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而后用指針變量調用它,因此可以先后指向不同的函數,不過注意,指向函數的指針變量沒有++和--運算,用時要小心。
            波多野结衣久久一区二区| 久久久久久久久久久久中文字幕| 青青草原1769久久免费播放| 91精品国产色综久久| 午夜精品久久久久久影视riav| 久久精品国产精品亚洲毛片| 久久久久亚洲?V成人无码| 欧美亚洲色综久久精品国产| 久久亚洲国产欧洲精品一| 久久久久亚洲精品日久生情 | 国内精品久久久久久野外| 久久青青草原综合伊人| 麻豆精品久久久久久久99蜜桃 | 三级三级久久三级久久| AV狠狠色丁香婷婷综合久久| 综合久久精品色| 99久久777色| 无码久久精品国产亚洲Av影片| 久久久久亚洲精品天堂久久久久久| 久久水蜜桃亚洲av无码精品麻豆| 少妇被又大又粗又爽毛片久久黑人 | 国产精品久久久久久久人人看| 93精91精品国产综合久久香蕉 | 无码人妻久久一区二区三区蜜桃| 久久精品成人免费看| 人人狠狠综合久久88成人| 亚洲v国产v天堂a无码久久| 成人a毛片久久免费播放| 久久99精品国产一区二区三区| 久久香蕉超碰97国产精品 | 久久无码人妻精品一区二区三区| 久久国产精品久久| 国产成人精品久久免费动漫| 人妻久久久一区二区三区| 亚洲AV日韩精品久久久久久| 亚洲综合精品香蕉久久网| 亚洲va久久久噜噜噜久久天堂| 中文字幕久久精品无码| 中文字幕人妻色偷偷久久 | 亚洲午夜久久久久久久久电影网| 国产精品久久久久免费a∨|