2016-12-07 51 views
0

我有一個函數說空隙theFunc(INT NUM &,INT *陣列),其通過參考和陣列指針取入一個一個int傳遞通過引用一個堆棧中分配參數的陣列

theFunc(int num&, int* array) 
{ array[0] = num; 
} 

這是隻是一個例子,因此該函數簡單的東西

int main() 
{ int k = 3; 
    int* theArray = new int[5]; 
    theFunc(k, theArray); 

delete[] theArray; 
return(0); 
} 

我的問題是如何爲k,堆棧分配INT例如,通過參考theFunc傳遞並存儲在動態存儲陣列。我知道對象/參數不能在棧和堆之間移動,因爲它們具有特定的存儲內存地址。我想知道爲什麼這會起作用,以及發生了什麼(如果這種情況與通過值傳遞有所不同)。

謝謝!

+2

堆棧變量也有內存地址。地址只是以與堆地址相同的方式傳遞給函數。 –

+0

另一個關鍵點是'k'的_value_正被_copied_變成'array [0]' – qxz

+0

'int num&'是一個語法錯誤。 'theFunc'必須有返回類型。請發佈真實的代碼 –

回答

1

簡短的回答是,k未被「存儲」在動態分配的數組中。相反,當你編寫int *theArray = new int[5]時,你正在分配一個可以容納五個整數數組的內存塊。實際上它已經有確實有有五個整數:除了別的以外,theArray[0]是一個有效的表達式,即它是一個整數,雖然它的值可能是-32,768或類似的東西。當您撥打theFunc並參考k時,您正在將theArray[0]的值更改爲k複製分配,因此您將k的值分配給數組的第一個元素。你沒有儲存任何新東西,你只是在改變已存儲的東西的價值。

事實上,在這種特殊情況下,通過引用num來獲得或丟失任何東西。如果按值傳遞,那麼函數的可觀察行爲將是相同的。

0

您的變量K存在於堆棧中,它只是程序正在使用的一塊內存。因此,每個堆棧條目仍然作爲可尋址的內存位置存在。

當你調用Func時,K的那個地址被壓入調用堆棧,並在Func中彈出。在對數組位置進行賦值時,將num(或K)的值(即傳入的地址處的值)複製到數組中。

在這種情況下,由於函數沒有改變num(或K),所以按值傳遞會產生相同的效果。