• <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>
            隨筆 - 8  文章 - 26  trackbacks - 0
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章分類

            文章檔案

            相冊(cè)

            C++語(yǔ)言

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            指針, 指針的指針, 數(shù)組, 指針數(shù)組, 數(shù)組指針, 指針函數(shù), 函數(shù)指針-----轉(zhuǎn)載



            --------------指針----------------
            int a=10;
            int *p=&a;

            -------------指針的指針-----------
            int b=20;
            int *p=&b;
            int **p2p=&p;

            -------------簡(jiǎn)單數(shù)組-----------------
            int c[10];//整數(shù)數(shù)組,含有10個(gè)整數(shù)元素
            也就是說每一個(gè)元素都是整數(shù)

            --------------指針數(shù)組--------------------
            int *p[10];//指針數(shù)組,含有10個(gè)指針元素
            也就是說每一個(gè)元素都是指針

            --------------數(shù)組指針--------------------
            int (*p)[10];//數(shù)組指針,這個(gè)指針能夠用來指向
            含有10個(gè)元素的整數(shù)數(shù)組

            ------------函數(shù)指針---------------------

            int (*p)( ); // 指向函數(shù)的指針...這里聲明了一個(gè)指針p,該指針指向返回值是整型(即函數(shù)類型為整型)的函數(shù)!


            ----------------指針函數(shù)---------------------------

            int *p(int a,float b); //返回值為指針的函數(shù)...該函數(shù)返回指向整型變量的指針!

            即該函數(shù)的類型為int *, p和上例不同,他是函數(shù)名!上例中是指針!

            ===========================================================================

            C/C 中函數(shù)指針的含義

            作者:管寧

              函數(shù)存放在內(nèi)存的代碼區(qū)域內(nèi),他們同樣有地址,我們?nèi)绾文塬@得函數(shù)的地址呢?

              假如我們有一個(gè)int test(int a)的函數(shù),那么,他的地址就是函數(shù)的名字,這一點(diǎn)如同數(shù)組相同,數(shù)組的名字就是數(shù)組的起始地址。

              定義一個(gè)指向函數(shù)的指針用如下的形式,以上面的test()為例:

            int (*fp)(int a);//這里就定義了一個(gè)指向函數(shù)的指針

              函數(shù)指針不能絕對(duì)不能指向不同類型,或是帶不同形參的函數(shù),在定義函數(shù)指針的時(shí)候我們很容易犯如下的錯(cuò)誤。

            int *fp(int a);//這里是錯(cuò)誤的,因?yàn)榘凑战Y(jié)合性和優(yōu)先級(jí)來看就是先和()結(jié)合,然后變成了一個(gè)返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點(diǎn)尤其需要注意!

              下面我們來看一個(gè)具體的例子:

            #include <iostream>
            #include <string>
            using namespace std;

            int test(int a);

            void main(int argc,char* argv[])
            {
            cout<<test<<endl;//顯示函數(shù)地址
            int (*fp)(int a);
            fp=test;//將函數(shù)test的地址賦給函數(shù)學(xué)指針fp
            cout<<fp(5)<<"|"<<(*fp)(10)<<endl;
            //上面的輸出fp(5),這是標(biāo)準(zhǔn)c 的寫法,(*fp)(10)這是兼容c語(yǔ)言的標(biāo)準(zhǔn)寫法,兩種同意,但注意區(qū)分,避免寫的程式產(chǎn)生移植性問題!
            cin.get();
            }

            int test(int a)
            {
            return a;
            }

              typedef定義能夠簡(jiǎn)化函數(shù)指針的定義,在定義一個(gè)的時(shí)候感覺不出來,但定義多了就知道方便了,上面的代碼改寫成如下的形式:

            #include <iostream>
            #include <string>
            using namespace std;

            int test(int a);

            void main(int argc,char* argv[])
            {
            cout<<test<<endl;
            typedef int (*fp)(int a);//注意,這里不是生命函數(shù)指針,而是定義一個(gè)函數(shù)指針的類型,這個(gè)類型是自己定義的,類型名為fp
            fp fpi;//這里利用自己定義的類型名fp定義了一個(gè)fpi的函數(shù)指針!
            fpi=test;
            cout<<fpi(5)<<"|"<<(*fpi)(10)<<endl;
            cin.get();
            }

            int test(int a)
            {
            return a;
            }

              函數(shù)指針同樣是能夠作為參數(shù)傳遞給函數(shù)的,下面我們看個(gè)例子,仔細(xì)閱讀您將會(huì)發(fā)現(xiàn)他的用處,稍加推理能夠很方便我們進(jìn)行一些復(fù)雜的編程工作。

            //-------------------該例以上一個(gè)例子作為基礎(chǔ)稍加了修改-----------------------------
            #include <iostream>
            #include <string>
            using namespace std;

            int test(int);

            int test2(int (*ra)(int),int);

            void main(int argc,char* argv[])
            {
            cout
            <<test<<endl;
            typedef int (*fp)(int
            );
            fp fpi;
            fpi=test;
            //fpi賦予test 函數(shù)的內(nèi)存地址

            cout<<test2(fpi,1)<<endl;//這里調(diào)用test2函數(shù)的時(shí)候,這里把fpi所存儲(chǔ)的函數(shù)地址(test的函數(shù)地址)傳遞了給test2的第一個(gè)形參
            cin
            .get();
            }

            int test(int
            a)
            {
            return
            a-1;
            }

            int test2(int (*ra)(int),int b)//這里定義了一個(gè)名字為ra的函數(shù)指針
            {
            int c=ra(10) b;//在調(diào)用之后,ra已指向fpi所指向的函數(shù)地址即test函數(shù)
            return
            c;
            }

              利用函數(shù)指針,我們能夠構(gòu)成指針數(shù)組,更明確點(diǎn)的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。

            #include <iostream>
            #include <string>
            using namespace std;

            void t1(){cout<<"test1";}
            void t2(){cout<<"test2";}
            void t3(){cout<<"test3";}
            void main(int argc,char* argv[])
            {
            void* a[]={t1,t2,t3};
            cout<<"比較t1()的內(nèi)存地址和數(shù)組a[0]所存儲(chǔ)的地址是否一致"<<t1<<"|"<<a[0]<<endl;

            cout<<a[0]();//錯(cuò)誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的

            typedef void (*fp)();//自定義一個(gè)函數(shù)指針類型
            fp b[]={t1,t2,t3}; //利用自定義類型fp把b[]定義趁一個(gè)指向函數(shù)的指針數(shù)組
            b[0]();//現(xiàn)在利用指向函數(shù)的指針數(shù)組進(jìn)行下標(biāo)操作就能夠進(jìn)行函數(shù)的間接調(diào)用了;
            cin.get();
            }

              仔細(xì)看上面的例子可能不用我多說大家也會(huì)知道是怎么一會(huì)事情了,最后我們做一個(gè)重點(diǎn)小結(jié),只要記住這一點(diǎn),對(duì)于理解利用函數(shù)指針構(gòu)成數(shù)組進(jìn)行函數(shù)間接調(diào)用就很容易了!

            void* a[]={t1,t2,t3};
            cout<<"比較t1()的內(nèi)存地址和數(shù)組a[0]所存儲(chǔ)的地址是否一致"<<t1<<"|"<<a[0]<<endl;

            cout<<a[0]();//錯(cuò)誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的

              上面的這一小段中的錯(cuò)誤行,為什么不能這么調(diào)用呢?

              前一篇教程我們已說的很清楚了,但是在這里我們還是復(fù)習(xí)一下概念,指針數(shù)組元素所保存的只是個(gè)內(nèi)存地址,既然只是個(gè)內(nèi)存地址就不可能進(jìn)行a[0]()這樣地址帶括號(hào)的操作,而函數(shù)指針不同他是個(gè)例外,函數(shù)指針只所以這么叫他就是因?yàn)樗侵赶蚝瘮?shù)指向內(nèi)存的代碼區(qū)的指針,他被系統(tǒng)授予允許和()括號(hào)操作的權(quán)利,進(jìn)行間接的函數(shù)調(diào)用,既然函數(shù)指針允許這么操作,那么被定義成函數(shù)指針的數(shù)組就一定是能夠相同的操作的。


            原文地址 http://www.netinter.cn/info/html/chengxusheji/C-C--/20080224/11853.html
            posted on 2008-06-11 17:00 楊彬彬 閱讀(191) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++語(yǔ)言
            国产成人精品综合久久久久| 久久精品成人一区二区三区| 亚洲国产日韩欧美综合久久| 色99久久久久高潮综合影院 | 久久久久久久精品成人热色戒| 国产精品久久新婚兰兰| 亚洲va久久久噜噜噜久久 | 91精品久久久久久无码| 精品伊人久久久| 国产欧美一区二区久久| 怡红院日本一道日本久久| 久久综合一区二区无码| 久久婷婷五月综合色奶水99啪| 久久亚洲AV永久无码精品| 精品久久8x国产免费观看| 免费精品久久久久久中文字幕 | 一本久久a久久精品综合夜夜 | 国产精品99久久精品爆乳| 无码专区久久综合久中文字幕| 狠狠88综合久久久久综合网| 97精品依人久久久大香线蕉97 | 97精品伊人久久久大香线蕉| 精品久久久久久国产| 亚洲国产香蕉人人爽成AV片久久| 2021久久国自产拍精品| 人妻无码αv中文字幕久久琪琪布| 久久伊人色| 久久亚洲AV永久无码精品| 精品久久久久久国产免费了| 久久精品国产精品亚洲精品| 日韩乱码人妻无码中文字幕久久| 午夜精品久久久久| 亚洲成av人片不卡无码久久| 欧美精品一本久久男人的天堂| 99国产欧美精品久久久蜜芽| 久久精品中文无码资源站| 国产精品无码久久久久久| 国产成人久久精品区一区二区| 久久久久亚洲AV无码专区体验| 久久青青草原精品国产| 久久精品人成免费|