C++:按值傳遞的還有地址

在寫vector的時候,我對“地址在傳入到函數中時它也是一個變量”這個觀點更加的清晰了,在寫vector的構造函數的時候需要調用一個函數,該函數具有的功能是分配內存空間並將這些空間填充上應有的值。

這個函數如下:

template<class T, class Alloc>
typename vector<T, Alloc>::iterator vector<T, Alloc>::allocate_and_fill(size_type n, const value_type& val)
{
    iterator result = data_allocator::allocate(n);
    uninitialized_fill_n(result, n, val);
    result = result - n;
    return result;
}

源代碼是這樣寫的,大致的意思就是在以result爲起點,對這個迭代器指向的元素進行val的賦值,並對該點及以後的點都是這樣進行操作。
但是我之前由於對“地址在傳入到函數中時它也是一個變量”理解不深,我認爲在將result傳入uninitialized_fill_n中後,result也是一步步地向前走,然後當循環n次後退出。

但是我在調試的時候,發現走到最後一步return result;的時候,result顯示的地址是一個很大的負數,很明顯result所指向的這個地方並沒有被初始化。但是明明在uninitialized_fill_n(result, n, val);中已經進行初始話了啊?

這個時候我才反應過來:我們在uninitialized_fill_n(result, n, val);中傳進去的是result的副本,result並沒有進行變化,在uninitialized_fill_n(result, n, val);中每次循環確實都是將地址進行了++操作,但是那是地址的變化,result這個變量並沒有變化,還是表示的是申請新內存所返回的指針。

所以最後的做法將result = result - n;註釋掉就可以了,記住:將表示地址的變量傳到函數中時,穿進去的是變量的副本,副本表示的是地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章