2012-08-17 73 views
3

嗨,夥計們我有一個問題根值是返回NULL每次我從插入函數出去我真的不明白爲什麼指針不保留它的值。指針值丟失

​​
+0

這是一個經典的指針問題。我有很多次,我遵循簡單的規則。需要更改變量的值?通過它的地址。這意味着需要更改指針的值?通過它的地址! – Abhinav 2012-08-17 05:17:55

回答

2

該指針不是「丟失」它的值。您需要將指向指向節點的指針傳遞給insert - 然後它可以通過參數「返回」指向節點的指針。

2

您是按值傳遞root所以它不能由被調用方進行修改,你必須參考

void insert(node** _node,int val); 
insert (&root,input); 
1

如果你想在一個函數中改變root指針(或任何指針),通過它,你需要傳遞一個指向那個指針的指針(或者如果你使用C++的話更可能是一個引用,並且我敢肯定你是在使用new)。例如:

void fn (node **pRoot) { 
    *pRoot = new node; 
} 

C和C++都是默認的按值傳遞,所以更改不會回顯到更高的級別。

考慮下面的代碼:

void changeVals (int x, int *py, int &z) { 
    x = 1; 
    *py = 2; 
    z = 3; 
} 

int X = 0; 
int Y = 0; 
int Z = 0; 
changeVals (X, &Y, Z); 

在這一點上,無論是YZ也會有變化,但X仍然是零。

指針並沒有什麼不同。如果你想在一個函數中改變指針本身,它必須作爲一個指針傳遞給它(並在函數中解引用)或作爲引用類型。

0

除了這裏所有關於pointers to pointers的回答,我想指出你的insert函數正在分配永遠不會被刪除的內存。

您需要設計處理allocationsdeallocations的系統。

1

簡短的回答:您正在使用C++,你忘了輸入一個字符或您的鍵盤出了問題......正確的代碼是

void insert(node *& _node, int value) // note '&' 
{ 
    ... 
} 

龍答:

通常爲C和C++函數參數「按價值」,這意味着該調用的函數將得到副本的你通過什麼他們 ...

void foo(int x) 
{ 
    x = 42; 
} 

void bar() 
{ 
    int k = 12; 
    foo(k); 
    // Here k is still 12, not 42 
} 

C++如何永遠有「參考」的概念,允許您傳遞參數而不進行復制,然後函數可以例如更改調用者變量。將foo(int x)更改爲foo(int& x)bar中的值k在呼叫後將變爲42。

如果您使用C++ &字符告訴編譯器node參數應該通過引用而不是通過值傳遞(即你不想做一個指針的副本,但該函數應該工作直接與你的變量。

如果您是來自Visual Basic,那麼請記住,除非另有說明(並且在大多數其他現代語言中也會發生相同情況),否則所有參數均爲C和C++中的byval

實際上,在C語言和其他大多數現代語言中,根本沒有辦法通過引用傳遞參數。