2016-09-01 57 views
0

我正在進行初學者(!)練習。功能調用指針問題

我很喜歡傳遞基本變量,也使用&變量參數,所以我可以對返回時未被破壞的變量進行更改。但我仍然在學習指針。我正在研究基本的突變兔子運動(鏈表練習)。

其中我通過聲明班級兔子創建一個鏈表。我按照您的預期設置數據部分和「下一個」指針來設置鏈接。

struct Bunny { 
    string name; 
    int age; 
    // more variables here 
    Bunny* next; 
}; 

一切都很正常,當我打電話功能做事喜歡用函數來創建兔子:

Bunny* add_node (Bunny* in_root){} 

這將設置節點,並返回它就像我想要的。我也可以做一些事情,比如調用一個函數來修改Bunny類,比如老化兔子。

void advanceAge (Bunny* in_root){} 

我通過在頭上,然後我可以修改調用的函數兔子,甚至當它返回到主它保持修改。例如,我可以使用:

in_root->age ++; 

在被調用的函數,當我回到「主」它仍然改變。基本上我可以在任何調用的函數中使用 - >並永久地進行更改。我認爲,因爲指針是由 - >取消引用(?),但仍然讓我的頭在...

到目前爲止好。

當我想調用一個函數來刪除列表時,問題出現了。 (核選項...沒有更多的兔子)

我可以刪除被調用函數中的所有節點...但它不會更改'主'中的兔子。例如...這不會永久刪除節點。

void DeathCheck(Bunny* in_root){ 
    Bunny* prev_ptr; 
    prev_ptr = in_root; 
    if (prev_ptr == NULL){ 
     cout << "No list to check age." << endl; return; 
    } else {   
prev_ptr = NULL; // <- what could I code to have this stick?  return;} 
// rest of DeathCheck 

我很好奇,如果有一種方法可以在被調用的函數中將節點設置爲NULL並讓它粘住?

+0

您需要提供更多詳細信息。 addnalode()如何工作。在哪裏,以及如何,整個兔子列表都被存儲。有一個合理的機會,你可能不會做你認爲你在add_node()中做的事。 –

回答

1

由於您按值通過in_root,因此無法修改調用者的變量。你可以通過引用傳遞它。

void DeathCheck(Bunny* &in_root) { 
    Bunny *prev_ptr = in_root; 
    ... 
    in_root = nullptr; 
    return; 
} 
+0

這工作!謝謝,我明白了。 :) – Marc

0

目前,DeathCheck(Bunny* in_root),有沒有辦法,in_root可以改變的,只是它指向的對象是可以改變的。 (見pass by reference and value with pointers)。在此基礎上,你需要改變的參數傳遞通過引用,例如,通過改變你的函數的簽名是:

DeathCheck(Bunny* &in_root) 
{ 
    //... 
} 

這傳遞Bunny引用,這意味着它可以不用重新分配到複印件。

+0

這工作!謝謝,我明白了。 :) – Marc