我們都知道c++中的參數傳遞是值傳遞,想要通過函數修改形參,一般使用指針或者引用。
那麼有時候我們對於傳入的指針地址希望做修改怎麼辦呢?
今天在寫一個樹結構的題時碰到這個問題
大概代碼是
void insert_array(TreeNode *&node, int *array, int left, int right)
{
if(left > right)
return;
int min_val = array[left];
int min_index = left;
for(int i = left+1; i < right; i++)
{
if(array[i] < min_val){
min_val = array[i];
min_index = i;
}
}
node = new TreeNode(); //這裏如果node是指針就出錯了
node->val = min_val;
insert_array(node->left, array, left, min_index-1);
insert_array(node->right, array, min_index + 1, right);
}
主要是倒數三四行代碼,之前傳入的參數爲TreeNode *node結果一直錯,後來加上引用就對了。
原因其實也簡單,就是我們把指針當作形參傳入時,傳的是地址,事實上這個地址的值也是形參。
而
node = new TreeNode();
應該相當於
TreeNode *newNode = new TreeNode();
node = newNode;
new一個值會產生一個新的地址,那麼就需要修改node的地址,但是我們傳入的node的地址是一個形參,值傳遞,你在函數內修改它的地址對於傳入的地址沒有影響,這樣當然就爆炸了。。。。所以如果需要讓這個指針的地址是可變的,應該傳入的參數是*&的形式