2012-12-17 78 views
2

我想要實現的是說我有一個數組,我希望能夠通過指向它來修改整個代碼中的特定數組元素。指向數組元素

例如在C++中,我可以做到這一點

int main(){ 
int arr [5]= {1,2,3,4,5}; 
int *c = &arr[3]; 
cout << arr[3] <<endl; 
*c = 0; 
cout << arr[3]<<endl; 
} 

我做了一些谷歌搜索,並似乎有一種方法,通過「不安全」這樣做,但我真的不希望走這條路。

我想我可以創建一個變量來存儲索引,但我實際上是在處理稍微複雜(列表中的列表。所以有兩個指標變量似乎複雜性添加到代碼。)

C#有一個數據綁定類,所以我目前正在做的是將數組元素綁定到一個文本框(我已隱藏),並修改該文本框,只要我想修改特定的數組元素,但這也不是一個好的解決方案(因爲我有一個文本框沒有用於其預期的目的 - 有點誤導)。

+0

以下任何類型的可以是指針類型: 爲sbyte,字節,短,USHORT,INT,UINT,長,ULONG,炭,浮點,雙精度,小數或布爾 任何枚舉類型。 任何指針類型。 任何用戶定義的結構類型,只包含非託管類型的字段。 – MethodMan

+0

你不能創建一個var來存儲索引,但是在C中,你會將一個指針存儲在一個變量中,並且會對它感到滿意嗎?聽起來很奇怪,不是嗎? – igrimpe

+0

@igrimpe我不知道,一個指向我的指針告訴你具體是什麼。如果我有私人int columnIndexOfElement;和private int rowIndexOfElement;這似乎有點奇怪 – regular

回答

2

一個C#的例子,你如何使用看看會有所幫助。如果我明白你在問什麼,那麼這樣一個簡單的課就可以做到。你所要求的,似乎不是一個好主意。如果您展示了您需要的更大範圍,有人可能會指出一個更好的設計,而您根本不需要這種功能。

public class ListElement<T> { 
    private IList<T> list; 
    private int index; 
    public ListElement(IList<T> list, int index) { 
     this.list = list; 
     this.index = index; 
    } 
    public T Value { 
     get { 
      return list[index]; 
     } 
     set { 
      list[index] = value; 
     } 
    } 
} 

一個使用這個看起來像

int[] arr = new int[] {1,2,3,4,5}; 
ListElement<int> third = new ListElement<int>(arr, 2); 
Console.WriteLine(third.Value); 
third.Value = 0; 
Console.WriteLine(third.Value); 
+0

你可以在整個過程中使用IList ',然後它可以使用'列表「或數組 – Servy

+0

@Servy - 編輯以包含您的建議 – hatchet

0

我不確定這是否恰好,但問題是,這些指針在c#中是不可能的。

如果你有更復雜的列表,你可以看看LinkedList<T> 它提供了一個高性能的方式,如果你想更改列表中的元素。

+0

幾乎所有關於鏈表的內容都不適用於除最小數據集之外的其他任何內容。某些類型操作的漸近複雜度很低,但由於每個項目位於堆棧的不同位置,因此內存局部性的丟失*會極大地降低簡單任務(如迭代序列)的性能。 – Servy

+0

通過將鏈表實現爲結構數組,可以在C#中創建鏈接列表,該列表不使用單獨的對象。這也使得它比通過堆分散的Node對象更容易CPU緩存。我有一個例子,我寫在這裏:http://blog.softwx.net/2012/07/exploring-c-linkedlists-via-lru-caches.html – hatchet

+0

@Servy你是對的,但作爲問題問清單的列表,另一種數據結構可以簡化這個問題。而不是將項目添加到列表中的列表中,使用單個鏈接列表可能會更高效......它實際上取決於特定應用程序 – user287107

0

我想出了在C#中有些解決方案。當然,這是袖口,所以它可能無法在所有情況下工作,但我確實測試了一下你的情況。

class Wrapper<T> 
{ 
    private T[] array; 
    private T item; 
    private int index; 
    public T Item { get { return item; } set { item = value; 
     array[Index] = value; 
    } } 

    public int Index 
    { 
     get { return index; } 
     set 
     { 
      index = value; 
      Item = array[value]; 

     }  
    } 

    public Wrapper(T[] arr) 
    { 
     array = arr; 
    } 

} 

然後,您可以使用類是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] i = {1, 2, 3, 4, 5}; 
     i.ToList().ForEach(x => Console.WriteLine(x)); 
     Wrapper<int> w = new Wrapper<int>(i); 
     w.Index = 2; 
     w.Item = 5; 


     i.ToList().ForEach(x => Console.WriteLine(x)); 
     Console.ReadLine(); 
    } 
} 

這會給輸出:1234512545

這不是在C溶液漂亮++,但它會工作作爲你需要並提供一個更「自動」的引用數組的版本。

+0

包裝器沒有理由保留它自己的值副本,實際上它不應該是因爲它不會看到底層數組的更新。看到斧頭的答案。 – Servy

0

我會包裝你的陣列在Objects。在C#中,需要指針操作的東西通常最好用對象完成。

優點是對象允許更清晰的命名和訪問更復雜的數據結構。你是對的,這是不理想的通過各種指數 - 排序和索引很容易混亂..事實上,我認爲是你的位置的人誰決定面向對象編程將是一個好主意!

因此,您有class MyArray { },並且可以像使用指針一樣使用「對象引用」,您還可以創建MyArray[]的數組。

相關問題