嗨,夥計們我有一個問題根值是返回NULL每次我從插入函數出去我真的不明白爲什麼指針不保留它的值。指針值丟失
指針值丟失
回答
該指針不是「丟失」它的值。您需要將指向指向節點的指針傳遞給insert
- 然後它可以通過參數「返回」指向節點的指針。
您是按值傳遞root
所以它不能由被調用方進行修改,你必須參考
void insert(node** _node,int val);
insert (&root,input);
如果你想在一個函數中改變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);
在這一點上,無論是Y
和Z
也會有變化,但X
仍然是零。
指針並沒有什麼不同。如果你想在一個函數中改變指針本身,它必須作爲一個指針傳遞給它(並在函數中解引用)或作爲引用類型。
除了這裏所有關於pointers to pointers
的回答,我想指出你的insert
函數正在分配永遠不會被刪除的內存。
您需要設計處理allocations
和deallocations
的系統。
簡短的回答:您正在使用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語言和其他大多數現代語言中,根本沒有辦法通過引用傳遞參數。
- 1. 由雙指針指向的指針值丟失(c代碼)
- 2. 輸入函數時指針丟失值
- 3. C - 丟失指針結構值
- 4. C++指針「丟失」它的值
- 5. C pthread,指針丟失內容
- 6. 指針丟失在發佈版本
- 7. Strtok遞歸調用指針丟失
- 8. 功能丟失指針信息
- 9. 函數調用後,C++指針在繼承中丟失了值。
- 10. 指針丟失其值+ execv編譯警告
- 11. 指向衍生類對象的指針丟失vfptr
- 12. C - 指向int的本地指針丟失了一半大小
- 13. 將指針指向int64_t時丟失了最重要的32位
- 14. 在運行時會丟失NSMutableDictionary中的對象。指針丟失莫名其妙
- 15. 函數調用值後的C返回結構指針值丟失
- 16. 損失指針
- 17. 指針值C空指針
- 18. Ajax.ActionLink值丟失
- 19. 返回指向指向對象的指針矢量的指針後數據會丟失
- 20. 指針malloc失敗
- 21. 當手動更改堆棧指針時,GDB會丟失
- 22. 二進制搜索樹:在插入函數中丟失指針
- 23. Deque從中間擦除,指針是否丟失?
- 24. Valgrind:分配一個指針後丟失字節
- 25. valgrind內存丟失在指針數組中
- 26. 指針丟失引用前一個節點C++
- 27. 捆綁丟失值
- 28. PHP mysql_real_escape_string丟失值
- 29. 指針和值
- 30. Constexpr指針值
這是一個經典的指針問題。我有很多次,我遵循簡單的規則。需要更改變量的值?通過它的地址。這意味着需要更改指針的值?通過它的地址! – Abhinav 2012-08-17 05:17:55