• <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語言二重指針的運用

             

            『摘要』本文主要通過實例展示C/C++中二重指針的用法和用途,對于諸如二叉樹等遞歸定義的數據結構有一定的指導作用

            【關鍵字】:C/C++、二重指針、遞歸

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

                              二叉樹創建函數

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

            //具體的操作步驟

            TREE tree = 0; //TREE為二叉樹結構體的指針型別

            createBinaryTree(tree);

            //先序遍歷

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

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

            //版本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新實例的地址=%d\n",st);

                return 1;

            }

            void getInstance(STUDENT s){

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

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

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

            }

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

            2 版本1的運行結果

             

            結果很顯然,指針傳入函數之后產生了一個新的副本,對副本的任何操作,都不會影響到原指針指向的結構體,與二叉樹創建失敗類似,目的指針的副本指向了目標結構體,產生了內存泄漏。

            這個問題的解決也十分的簡單,將結構體的指針作為實參傳入函數即可,這樣就可以直接操作目標指針,也就不會出現錯誤的結果。運用二重指針可以輕松實現,具體修改如下:

            //版本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新實例的地址=%d\n",st);

             return 1;

            }

            void getInstance(STUDENT s){

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

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

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

            }

            修改部分如黑體部分所示,具體的運行結果如下圖:

             3 版本2的運行結果

            測試成功,函數內部操作的指針就是實際傳入的指針,即通過二重指針實現了目標操作指針的實參傳遞,因此能達到預想的結果。這也說明了二重指針的實際用處。

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

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導航

            統計

            留言簿(1)

            隨筆分類(4)

            隨筆檔案(4)

            文章分類(2)

            文章檔案(2)

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品18| 久久久噜噜噜www成人网| 精品久久久久久久久久中文字幕 | 久久精品国产清自在天天线| 国产精品久久久久久五月尺| 久久亚洲精品无码AV红樱桃| Xx性欧美肥妇精品久久久久久 | 国产精品美女久久久免费| 亚洲国产天堂久久久久久| 久久久国产精品亚洲一区| 女同久久| 久久久久综合网久久| 伊人久久大香线蕉AV色婷婷色| 国产99久久九九精品无码| 少妇内射兰兰久久| 亚洲欧洲久久久精品| 久久精品国产99国产精品澳门 | 99精品久久久久久久婷婷| 国内精品伊人久久久影院| A级毛片无码久久精品免费| 国内精品久久久久久99| 色天使久久综合网天天| 日本加勒比久久精品| 品成人欧美大片久久国产欧美| 久久综合国产乱子伦精品免费| 伊人久久大香线蕉综合热线| 久久97久久97精品免视看秋霞| a级毛片无码兔费真人久久| 久久精品无码一区二区三区| 精品国产VA久久久久久久冰| 亚洲AV无码久久| 久久水蜜桃亚洲av无码精品麻豆| 中文精品久久久久人妻不卡| 无码久久精品国产亚洲Av影片| 狠狠综合久久综合88亚洲| 久久人做人爽一区二区三区| 一本久久精品一区二区| 99久久夜色精品国产网站| 亚洲国产精品无码久久SM| 精品久久久久久中文字幕人妻最新 | 精品蜜臀久久久久99网站|