關於建樹以及建單鏈表時要使用二重指標的原因
阿新 • • 發佈:2018-12-31
今天終於打算來處理下這個問題了,至於為什麼有的時候形參要使用二重指標,尤其是在建樹以及建立單鏈表的時候。
我們知道,在建立樹節點以及建立連結串列的節點的時候,一般的教材裡面是這樣寫
(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;