2014-01-15 129 views
2

我想能夠存儲對數組的引用,但不確定是否需要指針或從何處開始。我正在尋找類似於使用ref的函數,但是在一個變量中。以C#存儲數組的位置

+0

你是指「二維數組」還是「散列表」? – zey

+0

你的意思是你想要兩個或多個變量指向同一個數組? –

+0

我的意思是我有一個數組,我需要能夠在運行中訪問它。它不在我需要訪問它的範圍之外,我不想複製它。我希望能夠存儲對該數組的引用,以便我可以通過它訪問它。 – Zshelley

回答

4

假設有一個數組:

int[] a = new int[42]; 

可變a是到陣列的引用。你可以讓一個又一個這樣的:

int[] b = a; 

現在ab指同一陣列。

你可以像這樣的值賦給一個元素:

a[0] = 666; 

,然後使用其他參考看到相同的價值:

Debug.Assert(b[0] == 666); 

什麼將此歸結爲是事實上,數組是reference types。所以賦值運算符將引用複製到對象,並且不會複製對象本身。與value types對比,例如,結構體,爲其賦值操作符複製對象的值。

+0

我覺得它的工作就是這樣。假設b = a只會將a中的所有數據複製到b中。現在就試試,謝謝! – Zshelley

+1

@Zshelley數組是引用類型..因此,引用被複制..而不是他們引用的數據。 –

+0

副本僅適用於值類型。引用類型變量(所有對象)是指向堆中對象的指針 - 在C#中,它們看起來不像指針。在David的例子中,a和b是指針。但是,int a = 1; int b = a; (int是一個值類型)用值1的單獨副本定義兩個變量。您需要清楚地理解值和引用類型之間的差異。 –

0

如果您想存儲對數組的引用,因爲它們是引用類型,所以不需要使用C#等高級語言的指針(對內存位置的引用)。所有的引用類型變量都像指針一樣工作,但引用到高級語言(如C#)中的內存位置的過程是完全自動的,並且對用戶是隱藏的。

我已經回答了一個關於指針的問題(用Java編寫)here。即使語言不同,Java也是像C#這樣的高級語言,並且引用內存位置的過程也是類似的。

關於你的問題,如果你有一個這樣的數組:

int[] myArray = new int[2]; 

你可以存儲在另一個數組這樣的引用:

int[] myStoredArrayRef = myArray; 

現在,兩個對象指相同的數組,因爲它們指的是內存中相同的「位置」(您複製了它的引用)。事實上,如果你用這種方式修改myArray元素:

myArray[0] = 123; 

myStoredArrayRef元素將發生變化:

Console.WriteLine(myStoredArrayRef[0]); //it will print '123'; 

你也可以存儲到一個列表的引用,因爲他們'reference types(正如@DavidHeffernan指出的那樣)像數組一樣,使用相同的過程。

+0

這也適用於列表? – Zshelley

+0

是的,因爲它們也是參考類型。 –

+0

@Zshelley是的!大衛已經透露了我:-) –