left=tree->right=NULL;tree->number=v;return;}if(vnumber)in" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

指針參數(shù)在函數(shù)中不能改變指針指向的原因和解決

系統(tǒng) 2425 0

?

原始問題

? ? ? 實現(xiàn)二叉樹排序,需要使用一個數(shù)組構建一個二叉排序樹,最開始寫的代碼如下:

      
        struct
      
      
         BST{

    
      
      
        int
      
       number; 
      
        //
      
      
        保存數(shù)組元素的值
      
      
        struct
      
       BST*
      
         left;

    
      
      
        struct
      
       BST*
      
         right;

};




      
      
        void
      
       insertBST(BST* tree, 
      
        int
      
      
         v) {

    
      
      
        if
      
       (tree ==
      
         NULL) {

        tree 
      
      = 
      
        new
      
      
         BST;

        tree
      
      ->left=tree->right=
      
        NULL;

        tree
      
      ->number=
      
        v;

        
      
      
        return
      
      
        ;

    }

    
      
      
        if
      
       (v < tree->
      
        number)

        insertBST(tree
      
      ->
      
        left, v);

    
      
      
        else
      
      
        

        insertBST(tree
      
      ->
      
        right, v);

}




      
      
        void
      
       createBST(BST* tree, 
      
        int
      
       a[], 
      
        int
      
      
         n) {

    tree 
      
      =
      
         NULL;

    
      
      
        for
      
       (
      
        int
      
       i=
      
        0
      
      ; i<n; i++
      
        )

        insertBST(tree, a[i]);

}
      
    

? ? ? 結果發(fā)現(xiàn)每次進入insertBST的時候,tree指針都是空的。用簡單的例子做實驗,發(fā)現(xiàn)如果一個指針為NULL,那么在函數(shù)中指向一個對象,函數(shù)返回后指針依舊為空,即函數(shù)中更改指針指向的對象無效。

      
        void
      
       tmp(
      
        int
      
      *
      
         a)

{

        
      
      
        if
      
       (a==
      
        NULL)

        {

              a
      
      =
      
        new
      
      
        int
      
      
        ;

              
      
      *a=
      
        200
      
      
        ;

         }

         
      
      
        else
      
      

              *a=
      
        100
      
      
        ;

}




      
      
        int
      
      
         main()

{

    
      
      
        int
      
      * b=
      
        NULL;

    tmp(b);

    
      
      
        if
      
       (b ==
      
         NULL)

        cout 
      
      << 
      
        "
      
      
        b is null
      
      
        "
      
      
        ;

    
      
      
        else
      
      
        

        cout 
      
      << *b << 
      
        "
      
      
        "
      
      
        ;

}
      
    

? ? ? 運行上述代碼,發(fā)現(xiàn)輸出“b is null”,即b指針在tmp函數(shù)中被賦值無效。

? ? ? 而如果b指針預先執(zhí)行一個對象,那在tmp函數(shù)中改變其值是有效的。即在int*b = NULL下邊加上一行b=new int;的代碼,可以輸出改變后值為100.

?

? ? ? 如果希望在函數(shù)中為指針復制,可以使用額外一層的指針,具體代碼如下:

      
        void
      
       tmp(
      
        int
      
      **
      
         a)

{

        
      
      
        if
      
       (*a==
      
        NULL)

        {

              
      
      *a=
      
        new
      
      
        int
      
      
        ;

              
      
      **a=
      
        200
      
      
        ;

         }

         
      
      
        else
      
      

              **a=
      
        100
      
      
        ;

}




      
      
        int
      
      
         main()

{

    
      
      
        int
      
      * b=
      
        NULL;

    tmp(
      
      &
      
        b);

    
      
      
        if
      
       (b ==
      
         NULL)

        cout 
      
      << 
      
        "
      
      
        b is null
      
      
        "
      
      
        ;

    
      
      
        else
      
      
        

        cout 
      
      << *b << 
      
        "
      
      
        "
      
      
        ;

}
      
    

此時可以輸出200.

?

問題分析

? ? ? 為NULL的指針在函數(shù)中指向一個對象無效。而初始化之后可以改變指向?qū)ο蟮闹怠?

? ? ? 指針本身也是一個值,它的值是所指向?qū)ο蟮牡刂贰? 指針傳遞參數(shù)本質(zhì)上是值傳遞的方式,它所傳遞的是一個地址值。值 傳遞過程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,即 在棧中開辟了內(nèi)存空間以存放由主調(diào)函數(shù)放進來的實參的值,從而成 為了實參的一個副本。值傳遞的特點是被調(diào)函數(shù)對形式參數(shù)的任何操 作都是作為局部變量進行,不會影響主調(diào)函數(shù)的實參變量的值。

? ? ? 回到上述例子上,指針在傳遞時,相當于,在被調(diào)函數(shù)中,申明了一個int*的變量,其值就是傳遞進來的int*.即調(diào)用tmp(b)時,會執(zhí)行?int* c=int*b;?那么在被調(diào)函數(shù)的堆棧中修改局部變量int*c是 當然也是不會影響到int*b的地址。

? ? ? 但是當b指針不為NULL的時候,改變b指針的值會有效,這是因為局部變量c和參數(shù)b指向的是同一個對象,針對這個地址的修改在函數(shù)返回式依然有效。

?

解決方法

? ? ? 雙重星號的方式是有效的。

? ? ? 此時傳遞的不再是b指針的值,而是通過&b傳遞的b指針的地址,此時是參數(shù)是引用傳遞的,引用傳遞過程中,被調(diào)函數(shù)的形式參數(shù)雖然也作為局部變量在棧 中開辟了內(nèi)存空間,但是這時存放的是由主調(diào)函數(shù)放進來的實參變量 的地址。被調(diào) 函數(shù)對形參的任何操作都被處理成間接尋址,即通過棧 中存放的地址訪問主調(diào)函數(shù)中的實參變量。正因為如此,被調(diào)函數(shù)對 形參做的任何操作都影響了主調(diào)函數(shù)中的實參變量。因此可以在函數(shù)中改變b指針的值,也就是指針指向的對象。

?

? ? ? 可以看出,對指針取地址,函數(shù)定義的時候使用雙重星號的作用不僅僅是為指針賦初始值,還可以在函數(shù)中改變指針指向哪個對象,而在普通的指針參數(shù)傳遞中,函數(shù)只能改變指針指向?qū)ο蟮闹担荒芨淖冎羔樉唧w指向哪個對象。

?

? ? ? 說到底,出現(xiàn)該問題的原因還是對指針的理解以及對參數(shù)傳遞方式的理解不夠到位。

?

? ? ? 完整的二叉樹排序代碼見上一篇博客: http://www.cnblogs.com/zhaoshuai1215/p/3448154.html

?

指針參數(shù)在函數(shù)中不能改變指針指向的原因和解決方法


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费国产成人综合 | 欧美乱插 | 久久精品资源站 | 免费的爱爱视频 | 牛牛影院成人免费网页 | 91在线永久 | 久久永久视频 | 久久久这里有精品 | 中国一级特黄高清免费的大片 | 成人免费小视频 | 亚洲精品免费日日日夜夜夜夜 | 日韩免费在线观看 | 伊人免费视频 | 四虎在线最新永久免费播放 | 麻豆精品国产免费观看 | 久久伊人热 | 久久在线免费观看视频 | 四虎在线免费播放 | 日产精品久久久一区二区 | 四虎中文 | 一本本久综合久久爱 | 爱爱的免费视频 | 国产99热在线观看 | 99热久久这里只有精品首页 | 国产精品免费_区二区三区观看 | 亚洲国产99在线精品一区二区 | 欧美va放荡人妇大片 | 欧美激情在线观看一区二区三区 | 国产日韩欧美综合一区 | 国产成人a毛片 | 国产高清在线91福利 | 精品欧美在线 | 九九九九精品视频在线播放 | 婷婷六月综合网 | 久久天天躁狠狠躁狠狠躁 | 久久精品re | 香蕉tv亚洲专区在线观看 | 亚洲国产成人精品激情 | 日本大蕉香蕉大视频在线观看 | 日韩久久久精品中文字幕 | 99资源网 |