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

            C語言二重指針的運(yùn)用

            『摘要』本文主要通過實(shí)例展示C/C++中二重指針的用法和用途,對于諸如二叉樹等遞歸定義的數(shù)據(jù)結(jié)構(gòu)有一定的指導(dǎo)作用

            【關(guān)鍵字】:C/C++、二重指針、遞歸

            本人最近想實(shí)現(xiàn)一個B+樹,雖然對B+樹的理論有一定的認(rèn)識,但由于考研花去大量時間復(fù)習(xí)功課,對C的一些細(xì)節(jié)有所遺忘,因此決定從二叉樹的實(shí)現(xiàn)開始。但剛寫完二叉樹的創(chuàng)建函數(shù)且在編譯通過之后,調(diào)試時卻出現(xiàn)了問題。二叉樹是一種遞歸定義的數(shù)據(jù)結(jié)構(gòu),因此其創(chuàng)建函數(shù)也必定是遞歸的。其創(chuàng)建函數(shù)描述如下:

                              二叉樹創(chuàng)建函數(shù)

            理論上沒有錯誤,同時在創(chuàng)建二叉樹時也能成功,但通過本人編寫的先序遍歷該二叉樹時,卻顯示0,即空的二叉樹,相關(guān)操作代碼如下:

            //具體的操作步驟

            TREE tree = 0; //TREE為二叉樹結(jié)構(gòu)體的指針型別

            createBinaryTree(tree);

            //先序遍歷

            由于結(jié)果錯誤,因此開始調(diào)試,通過觀察發(fā)現(xiàn)當(dāng)createVinartTree(tree)操作完成后tree的屬性仍然為0,即仍然tree=0。后來又通過仔細(xì)分析,發(fā)現(xiàn)問題出在函數(shù)的參數(shù)上。雖然該函數(shù)傳入的是指針型別,屬于實(shí)參,但是該函數(shù)內(nèi)部主要以原指針作為操作對象,因此相對于指針來說,傳入的只是結(jié)構(gòu)體指針的形參。所以,在函數(shù)內(nèi)部操作的只是一個副本,因此二叉樹的創(chuàng)建失敗。

            為了解決這個問題,筆者決定驗(yàn)證自己的想法是否正確,于是寫了如下一段測試代碼,代碼如下:

            //版本1

            typedef struct student {

                char* name;

                int age;

            }Student,*STUDENT;

             

            void getInstance(STUDENT s);

             

            int main(){

                Student* st = 0;

                printf("指針st的地址=%d\n",&st);

                getInstance(st);

                printf("st新實(shí)例的地址=%d\n",st);

                return 1;

            }

            void getInstance(STUDENT s){

                printf("指針S的地址 =%d\n",&s);

                s = (Student*)malloc(sizeof(student));

                printf("s新實(shí)例的地址=%d\n",s);

            }

            這個函數(shù)的傳值形式與之前二叉樹的函數(shù)差不多,因此可以類比,具體運(yùn)行之后得到的記過是(如圖):

            2 版本1的運(yùn)行結(jié)果

             

            結(jié)果很顯然,指針傳入函數(shù)之后產(chǎn)生了一個新的副本,對副本的任何操作,都不會影響到原指針指向的結(jié)構(gòu)體,與二叉樹創(chuàng)建失敗類似,目的指針的副本指向了目標(biāo)結(jié)構(gòu)體,產(chǎn)生了內(nèi)存泄漏。

            這個問題的解決也十分的簡單,將結(jié)構(gòu)體的指針作為實(shí)參傳入函數(shù)即可,這樣就可以直接操作目標(biāo)指針,也就不會出現(xiàn)錯誤的結(jié)果。運(yùn)用二重指針可以輕松實(shí)現(xiàn),具體修改如下:

            //版本2

            typedef struct student {

             char* name;

             int age;

            }Student,**STUDENT;

             

            void getInstance(STUDENT s);

             

            int main(){

             Student* st = 0;

                printf("指針st的地址=%d\n",&st);

              getInstance(&st);

                printf("st新實(shí)例的地址=%d\n",st);

             return 1;

            }

            void getInstance(STUDENT s){

             printf("指針S的地址 =%d\n",s);

             *s = (Student*)malloc(sizeof(student));

             printf("s新實(shí)例的地址=%d\n",*s);

            }

            修改部分如黑體部分所示,具體的運(yùn)行結(jié)果如下圖:

             3 版本2的運(yùn)行結(jié)果

            測試成功,函數(shù)內(nèi)部操作的指針就是實(shí)際傳入的指針,即通過二重指針實(shí)現(xiàn)了目標(biāo)操作指針的實(shí)參傳遞,因此能達(dá)到預(yù)想的結(jié)果。這也說明了二重指針的實(shí)際用處。

            posted on 2010-01-26 22:49 望見 閱讀(2034) 評論(1)  編輯 收藏 引用 所屬分類: C++

            評論

            # re: C語言二重指針的運(yùn)用 2010-01-30 11:14 noside

            傳值和傳地址  回復(fù)  更多評論   

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(1)

            隨筆分類(4)

            隨筆檔案(4)

            文章分類(2)

            文章檔案(2)

            最新評論

            閱讀排行榜

            評論排行榜

            久久99精品国产麻豆宅宅| 久久久久亚洲精品男人的天堂| 久久亚洲国产最新网站| 久久夜色精品国产亚洲| 国内精品久久九九国产精品| 久久99精品久久久久久齐齐| 亚洲精品乱码久久久久久按摩 | 精品久久久一二三区| 久久精品人妻中文系列| 久久久久久狠狠丁香| 欧美精品乱码99久久蜜桃| 情人伊人久久综合亚洲| 伊人久久综合精品无码AV专区| 国产精品久久久久久久久| 欧美精品福利视频一区二区三区久久久精品 | 国产精品欧美久久久久天天影视| 天天影视色香欲综合久久| AV无码久久久久不卡蜜桃| 久久久无码精品亚洲日韩蜜臀浪潮| 久久免费美女视频| 青青草原精品99久久精品66| 久久精品亚洲男人的天堂| 99国产欧美精品久久久蜜芽 | 久久亚洲中文字幕精品一区四 | 免费精品久久天干天干| 久久精品国产精品亜洲毛片| 成人国内精品久久久久一区| 久久妇女高潮几次MBA| 亚洲婷婷国产精品电影人久久| 国产精品成人99久久久久| 伊人丁香狠狠色综合久久| 日韩精品国产自在久久现线拍 | 一本色道久久99一综合| 日产精品久久久久久久| 欧美黑人激情性久久| 久久99久国产麻精品66| 亚洲va久久久噜噜噜久久 | 国内精品人妻无码久久久影院| 亚洲va久久久噜噜噜久久| 久久精品人成免费| 久久亚洲国产午夜精品理论片|