2011-06-07 85 views
1

我有一個簡單的C++有關將數組傳遞給函數foo()的問題。假設我有兩個陣列A和B:在堆上傳遞數組並在堆棧上運行

double* A=new double[3]; 

double B[3]; 

當我通過既其旨在操縱兩個陣列的功能

foo(double* A; double *B) 

。然而,通過執行

foo(A,B) 

FOO作用於A的副本和離開FOO時()只將更改到B保留。 這是不是這種情況,如果foo的定義爲

foo(double* &A; double *B). 

我的問題:爲什麼是副本的創建,雖然我在第一循環中的如雙* A的地址(如B的情況下) foo()的例子?

+2

第一行代碼不能編譯。另外,你傳遞給函數的是兩種情況下的指針。在這兩種情況下,函數都可以通過這些指針來修改數組。請改善你的問題。 – sellibitze 2011-06-07 13:09:11

+1

在foo的第一個聲明中,兩個指針都是按值傳遞的,所以在foo中你將得到A和B的副本。在第二個聲明中,A是通過引用傳遞的,它在引擎之下是一個指向指針的指針,允許你在內部改變A。你是否意識到這一點,或者我誤解了你的問題? – 2011-06-07 13:11:22

+0

顯示你的foo()方法的代碼.. – 2011-06-07 13:19:00

回答

2

FOO作用於A的副本,只有改變爲b,保持在離開時FOO()。

你到底在做什麼?在兩種情況下,對象本身的變化都應在foo以外可見。如果你試圖改變指針A的值,它將不會在foo之外被看到 - 指針的副本被傳遞給函數,當然它仍然指向相同的數組。

+0

我發現我的錯誤。在foo()裏面我交換了指針。在第一種情況下,我僅交換了副本,並且在後來在foo之外操作數組時,對我的結果感到疑惑。儘管如此:感謝您的幫助! – 2011-06-07 13:25:31

1

如果你想傳遞一個數組引用,你必須使用一個雙指針引用的函數:

foo(double** A, double **B); 

double** A=new complex<double>[3];