1. 程式人生 > >關於建樹以及建單鏈表時要使用二重指標的原因

關於建樹以及建單鏈表時要使用二重指標的原因

今天終於打算來處理下這個問題了,至於為什麼有的時候形參要使用二重指標,尤其是在建樹以及建立單鏈表的時候。
我們知道,在建立樹節點以及建立連結串列的節點的時候,一般的教材裡面是這樣寫
(Node *)malloc(sizeof(Node))
這裡我認為就是為什麼要使用二重指標的原因

int BTreeCreate(BTree **tp)
{
    //構造方法,或者說構造順序:從左子樹開始構造
    int x;
    scanf("%d",&x);
    if(x<0)
    {
        *tp=NULL;//指標為空,樹節點中的某個指標為空
        return
0; } //++++++++++++++++++++++++++++// *tp=(BTree*)malloc(sizeof(BTree));//將樹節點中指標指向該地址空間 //++++++++++++++++++++++++++++// if(tp==NULL) return 0; (*tp)->data=x; BTreeCreate(&((*tp)->left)); BTreeCreate(&((*tp)->right)); return 1; }
//這裡呢,傳遞了一個指標,此時,實參M和形參pt指向記憶體的同一塊空間,都指向了null;
void get_Vale1(char *pt) { //正是因為這裡又重新開闢了一塊記憶體,此時呢,給形參pt的重新開闢了一塊空間, 而實參M沒有變化,還指向NULL; //就是這裡,M 和pt 已經沒有聯絡了,徹底變成了兩個指向不同的指標; pt=(char *)malloc(strlen("sx_liang")+1); strcpy(pt,"sx_liang"); //退出函式時,因為M是區域性變數,在棧中分配的空間,那麼M自動銷燬,而在堆中為M分配的空間呢,洩露了,沒有被釋放;是個問題! } //這裡呢,傳遞的是二級指標;此時,pt指向實參,而不是和實參M一樣指向null;*pt此時才和M相同,都指向了NULL;注意體會一下;
void get_Vale2(char **pt) { //在這裡呢,*pt就是實參M ,給*pt申請空間,就是在為實參M申請空間;注意體會了; *pt=(char *)malloc(strlen("sx_liang")+1); strcpy(*pt,"sx_liang"); //退出函式後,pt銷燬,但是它申請的空間沒被釋放,但是該空間有M指向它,不擔心釋放問題; } int main() { char *M=NULL; get_Vale1(M); //看看,這裡呼叫的過程中,傳遞的是一級指標; if( NULL==M) //額。。。。在這裡呢,就會執行if 裡邊的資訊了。。。 { cout<<"Mis NULL"<<endl; exit(1); } else cout<<M<<endl; get_Vale2(&M); //這裡呢,傳遞的是二級指標,結果呢,就輸出了“sx_liang"; if( NULL==M) { cout<<"M is NULL"<<endl; } else cout<<M<<endl;