• <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>

            MyMSDN

            MyMSDN記錄開發(fā)新知道

            指向函數(shù)的指針的一點(diǎn)理解

            準(zhǔn)確地講,本文所涉及的內(nèi)容是C++中較難理解的,本文的目的不是在于將它們解釋清楚,因?yàn)檫@需要你循序漸進(jìn)地做很多練習(xí)才可以??聪旅嬉粋€(gè)例子:

            int (*func(bool real))(int, int)

            你覺得它的返回值是什么?

            這里就涉及到了如何理解指向函數(shù)的指針的問題了。一些來自C++教材的建議是從里向外解讀這個(gè)表達(dá)式,這里所謂的里面就是func(bool real),那么剩下的部分就是所謂的返回值了?有點(diǎn)生硬吧。下面就讓我們循序漸進(jìn)地看看如何理解更好?

            為什么會(huì)對(duì)這個(gè)表達(dá)式的返回值產(chǎn)生疑問?

            要解決問題通常需要找出問題所在,這里是基于這樣一種思維定勢(shì),那就是我們通常習(xí)慣于這樣一種聲明變量的方式:

            int a;

            這里我們聲明a是一個(gè)int類型的變量。而對(duì)于返回值,我們通常也是采用類似的方式,如一個(gè)返回值為int類型的函數(shù)通??梢砸韵旅娴姆绞竭M(jìn)行聲明:

            int func([params]);

            因此我們慣性地認(rèn)為返回值就是最左側(cè)的一個(gè)類型名,雖然這通常是對(duì)的,但是針對(duì)上面的那個(gè)例子則顯得十分尷尬。

            讓我們看看一個(gè)指向函數(shù)的指針的聲明式:

            int (*pCompare)(int, int);

            這個(gè)指針的名字就是pCompare,令人奇怪的是pCompare并不是在整個(gè)聲明式的最右邊,類型也肯定不是int,而是一個(gè)復(fù)雜的表達(dá)式。讓我們用typedef來聲明就會(huì)發(fā)現(xiàn)typedef的使用也不太一樣。

            typedef int (*PF)(int, int);

            我們發(fā)現(xiàn)跟慣用的typedef *** ???;的方式也截然不同,在上面這個(gè)typedef過后,整個(gè)表達(dá)式可以被簡(jiǎn)化成:

            PF pCompare;

            現(xiàn)在我們似乎就一見如故了,現(xiàn)在的表達(dá)式看起來中規(guī)中矩,普通的聲明都是類型名加變量名完成聲明,而函數(shù)指針的聲明則是在一個(gè)表達(dá)式中一個(gè)固定的位置進(jìn)行聲明。

             

            int (*       )(int, int);

            在上文中劃線的部分即為聲明的部分,也就是這點(diǎn)不同讓我們逐漸迷失了方向。

            現(xiàn)在讓我們寫一個(gè)返回指向函數(shù)的指針的函數(shù),也就是返回值是PF的函數(shù),這就像我們從返回int類型的變量到返回int類型值的函數(shù)一樣,因此使用以下方式即可:

            PF func([params]);

            現(xiàn)在讓我們擴(kuò)展PF,將它還原,也就是把右側(cè)的func([params])部分移到那個(gè)橫線的位置上?,F(xiàn)在我們就可以很輕松地理解本文開頭的那個(gè)函數(shù),原來是返回值為int (*)(int, int)的函數(shù)

            int (*func(bool real))(int, int)

            以上劃線的部分也就是一個(gè)函數(shù)扣除返回值的部分。也就等價(jià)于

            PF func(bool real)

            至此你應(yīng)該能夠分析更加復(fù)雜的表達(dá)式了。

            下面的示例旨在幫助理解本文:

            /*
             * main.cc
             *
             *  Created on: 2009-2-1
             *      Author: Volnet
             
            */

            #include 
            <stdlib.h>
            #include 
            <iostream>
            using std::cout;
            using std::endl;

            int myCompare1(
                    
            int a, int b,
                    
            int (*Compare)(intint));
            int realCompare(int a, int b);
            int fakeCompare(int a, int b);

            typedef 
            int (*PF)(intint);
            int myCompare2(
                    
            int a, int b,
                    PF Compare);

            PF getAPointerFunc1(
            bool real);
            int (*getAPointerFunc2(bool real))(intint);

            int main(void){
                
            int typeDeclared;
                typeDeclared 
            = 1;

                
            //PF pCompare;
                int (*pCompare)(intint);

                
            if(pCompare == NULL)
                    cout
            <<"pCompare == NULL"<<endl;
                
            else
                {
                    cout
            <<"pCompare != NULL"<<" pComapre = "<<pCompare<<endl;
                }

                cout
            <<"Compare the pointer function."<<endl;
                cout
            <<"The compare result is : "<<
                    myCompare1(
            65, realCompare)<<endl;

                cout
            <<"It's the same to invoke realCompare & *realCompare : "<<
                    myCompare1(
            65*realCompare)<<endl;

                cout
            <<"Using the typedef to predigest definition : "<<
                    myCompare2(
            87, realCompare)<<endl;

                cout
            <<"Return a pointer from a function : "<<
                    myCompare2(
            1020, getAPointerFunc1(true))<<endl;

                cout
            <<"Return a pointer from a function : "<<
                    myCompare2(
            2030, getAPointerFunc2(false))<<endl;

                
            return EXIT_SUCCESS;
            }

            int myCompare1(
                    
            int a, int b,
                    
            int (*Compare)(intint)){
                
            return Compare(a, b);
            }
            int realCompare(int a, int b){
                cout
            <<"The realCompare has be invoked."<<endl;
                
            if(a == b)
                    
            return 0;
                
            if(a < b)
                    
            return -1;
                
            else
                    
            return 1;
            }

            int fakeCompare(int a, int b){
                cout
            <<"The fackCompare has be invoked."<<endl;
                
            return 200;
            }

            int myCompare2(
                    
            int a, int b,
                    PF Compare){
                
            return Compare(a, b);
            }

            PF getAPointerFunc1(
            bool real){
                
            if(real)
                    
            return realCompare;
                
            else return fakeCompare;
            }

            int (*getAPointerFunc2(bool real))(intint){
                
            if(real)
                    
            return realCompare;
                
            else return fakeCompare;
            }

             


             

            posted on 2009-02-01 18:24 volnet 閱讀(1654) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: 指向函數(shù)的指針的一點(diǎn)理解 2009-02-03 09:58 多多多多

            我記得是從里向外, 從左到右看.因?yàn)榫幾g器就是這么解析的  回復(fù)  更多評(píng)論   

            # re: 指向函數(shù)的指針的一點(diǎn)理解 2009-02-03 15:44 __ay

            看完匯編就好理解多了
            就是個(gè)函數(shù)地址
            也就是用jpm指令改下他的那個(gè)指令寄存器的值...
            嘿嘿...
            沒特別聲明的話編譯器的確是從左往又壓參數(shù)的  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            特殊功能
             
            国产精品久久久久a影院| 久久精品亚洲精品国产色婷| 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品久久久久中文字幕一区| 94久久国产乱子伦精品免费| 亚洲午夜无码久久久久小说| 久久影院综合精品| 久久艹国产| 丰满少妇高潮惨叫久久久| 国内精品欧美久久精品| AV无码久久久久不卡蜜桃| 久久九九全国免费| 久久国产色av免费看| 91精品婷婷国产综合久久| 久久人人青草97香蕉| 国产69精品久久久久99| 国产精品99久久久精品无码| 国产毛片久久久久久国产毛片| 伊人久久无码中文字幕| 久久久久国产一级毛片高清板| 亚洲国产精品久久久天堂| 久久亚洲2019中文字幕| 国产韩国精品一区二区三区久久 | 伊人久久大香线蕉AV色婷婷色| 丰满少妇人妻久久久久久4| 人妻精品久久久久中文字幕69| 久久精品亚洲福利| 国产成人精品久久亚洲高清不卡 | 久久久精品人妻一区二区三区蜜桃| 九九久久精品无码专区| 久久99热精品| 久久99免费视频| 99久久无色码中文字幕| 人妻少妇久久中文字幕一区二区 | 久久精品国产一区二区三区日韩| 精品久久久无码21p发布| 国产成人久久精品一区二区三区| 亚洲精品99久久久久中文字幕| 欧美精品一区二区久久 | 亚洲精品国精品久久99热一| 亚洲精品乱码久久久久久久久久久久 |