• <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年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章分類

            文章檔案

            相冊

            C++語言

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            指針, 指針的指針, 數組, 指針數組, 數組指針, 指針函數, 函數指針-----轉載



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

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

            -------------簡單數組-----------------
            int c[10];//整數數組,含有10個整數元素
            也就是說每一個元素都是整數

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

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

            ------------函數指針---------------------

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


            ----------------指針函數---------------------------

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

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

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

            C/C 中函數指針的含義

            作者:管寧

              函數存放在內存的代碼區(qū)域內,他們同樣有地址,我們如何能獲得函數的地址呢?

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

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

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

              函數指針不能絕對不能指向不同類型,或是帶不同形參的函數,在定義函數指針的時候我們很容易犯如下的錯誤。

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

              下面我們來看一個具體的例子:

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

            int test(int a);

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

            int test(int a)
            {
            return a;
            }

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

            #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);//注意,這里不是生命函數指針,而是定義一個函數指針的類型,這個類型是自己定義的,類型名為fp
            fp fpi;//這里利用自己定義的類型名fp定義了一個fpi的函數指針!
            fpi=test;
            cout<<fpi(5)<<"|"<<(*fpi)(10)<<endl;
            cin.get();
            }

            int test(int a)
            {
            return a;
            }

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

            //-------------------該例以上一個例子作為基礎稍加了修改-----------------------------
            #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 函數的內存地址

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

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

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

              利用函數指針,我們能夠構成指針數組,更明確點的說法是構成指向函數的指針數組,這么說可能就容易理解的多了。

            #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()的內存地址和數組a[0]所存儲的地址是否一致"<<t1<<"|"<<a[0]<<endl;

            cout<<a[0]();//錯誤!指針數組是不能利用數組下標操作調用函數的

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

              仔細看上面的例子可能不用我多說大家也會知道是怎么一會事情了,最后我們做一個重點小結,只要記住這一點,對于理解利用函數指針構成數組進行函數間接調用就很容易了!

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

            cout<<a[0]();//錯誤!指針數組是不能利用數組下標操作調用函數的

              上面的這一小段中的錯誤行,為什么不能這么調用呢?

              前一篇教程我們已說的很清楚了,但是在這里我們還是復習一下概念,指針數組元素所保存的只是個內存地址,既然只是個內存地址就不可能進行a[0]()這樣地址帶括號的操作,而函數指針不同他是個例外,函數指針只所以這么叫他就是因為他是指向函數指向內存的代碼區(qū)的指針,他被系統(tǒng)授予允許和()括號操作的權利,進行間接的函數調用,既然函數指針允許這么操作,那么被定義成函數指針的數組就一定是能夠相同的操作的。


            原文地址 http://www.netinter.cn/info/html/chengxusheji/C-C--/20080224/11853.html
            posted on 2008-06-11 17:00 楊彬彬 閱讀(183) 評論(0)  編輯 收藏 引用 所屬分類: C++語言
            午夜精品久久久久久99热| 亚洲七七久久精品中文国产| 国产偷久久久精品专区| 亚洲AV无一区二区三区久久| 色综合久久中文字幕无码| 久久免费高清视频| 久久久亚洲裙底偷窥综合| 久久久久久久亚洲Av无码| 国产精品综合久久第一页| 久久香综合精品久久伊人| 高清免费久久午夜精品| 国产精品久久久久久久人人看| 日产精品久久久一区二区| 久久久久久亚洲精品不卡| 久久精品www人人爽人人| 一级a性色生活片久久无| 精品久久久久久久久中文字幕| 日韩欧美亚洲综合久久| 久久久综合香蕉尹人综合网| 久久99国产精品一区二区| 亚洲精品乱码久久久久久久久久久久| 久久久久99精品成人片牛牛影视| 久久超乳爆乳中文字幕| 亚洲女久久久噜噜噜熟女| 亚洲人成无码网站久久99热国产 | 久久久久亚洲av综合波多野结衣| 国产产无码乱码精品久久鸭| 久久精品国产清自在天天线| 久久久久亚洲AV综合波多野结衣| 国产AⅤ精品一区二区三区久久| 亚洲AV无码久久精品狠狠爱浪潮| 久久国产亚洲精品| 亚洲精品无码久久不卡| 久久综合久久鬼色| 一本综合久久国产二区| 亚洲午夜无码久久久久小说| 免费一级欧美大片久久网| 久久久久久噜噜精品免费直播 | 日本人妻丰满熟妇久久久久久| 久久久久亚洲AV无码专区首JN | 久久综合久久综合久久|