C#-Zeiger



  • Wie kann ich einen Zeiger in C# erstellen und ihm eine Adresse von einer variable zuweisen??? 😕

    mfg:
    Euer Rebell 😉



  • gar nicht. Es gibt in C# keine Zeiger. Es gibt höchstens Referenzen, und selbst davon kriegst du nicht so viel mit.



  • hotblack schrieb:

    gar nicht. Es gibt in C# keine Zeiger.

    gibt es wohl: http://msdn2.microsoft.com/en-US/library/y31yhkeb.aspx



  • Thanks a lot! 🙂



  • ääheemmmmm genau genommen gibt es in c# schon zeiger

    nur muss man den codeabschnitt in dem man pointer verwenden möchte (z.B. die Funktion) als 'unsafe' deklarieren.

    Falls du pointer dafür benötigst Wertetypen aus einer Methode heraus zu verändern ohne dabei den Rückgabewert zu verschwenden tuts auch ein 'ref':

    pubic void foo(ref int a)
    {
     //...
    }
    

    so werden alle änderungen der funktion an a automatisch auch im aufrufer vorgenommen



  • Gibt es vielleicht eine andere möglichkeit ein Variabel zu "verlinken", ohne das man in "unsafe code" leuft? Sowas wie delegate für funktionen...



  • Maverick89 schrieb:

    Gibt es vielleicht eine andere möglichkeit ein Variabel zu "verlinken", ohne das man in "unsafe code" leuft? Sowas wie delegate für funktionen...

    Ja, ne normale Zuweisung:

    Object o = new Object();
    
    Object auch_o = o;
    

    Oder verstehe ich dich jetzt falsch?



  • Doch, eigentlich richtig. 🙂
    Aber das funktioniert ja nur mit Objekt-variabeln, was ist mit den stack-variablen (also int, char usw)?



  • Pointer auf Valuetypes?
    Möchtest du vielleicht mit den Nullable Types aus .NET2 arbeiten?

    Ansonsten: Für die meisten Wertetypen gibts auch einen Objekttyp. So entspricht dem "long" die Klasse "Long", und "int" wird durch "Int16" o. "Int32" repräsentiert.
    Eine Konversation zwischen diesen Objekttypen passiert automatisch, nennt sich auto-boxing.

    Anwendungsbsp:

    Long foo = new Long(23);
    Long auch_foo = foo;
    

    Ok so 🙂 ?



  • Das könnte die lösung sein, aber in welcher assembly sind diese klassen definiert?

    Error 1 The type or namespace name 'Long' could not be found (are you missing a using directive or an assembly reference?) C:\Documents and Settings\Maverick89\Local Settings\Application Data\Temporary Projects\ConsoleApplication1\Program.cs 14 29 ConsoleApplication1



  • So ist das in Java, in C# kann man eigene value types schreiben und daher kann nicht für jeden eine passende Wrapper-Klasse bereit stehen. Du kannst dir aber selber eine schreiben. 💡

    Boxing geht auch auch, kostet aber Unmengen an Performance. Ich frage mich aber eh, wofür man Werte verlinken will. Bei Objekten sehe ich es in gewisser Weise schon ein, aber wo liegt der Sinn darin, ein int oder auch nur ein Point zu verlinken? Werttypen sind typischerweise Bestandteil eines größeren Objekts, das dann selber wiederum eine Klasse ist und Referenzsemantik hat. Kurz, was du willst, ist eigentlich eher untypisch.

    Vielleicht beschreibst du mal deinen Anwendungsfall genauer, es gibt bestimmt eine schöne Lösung hierfür.



  • Vielleicht beschreibst du mal deinen Anwendungsfall genauer, es gibt bestimmt eine schöne Lösung hierfür.

    Naja, gerade die suche nach einer schönen lösung hat mich auf die frage gebracht. Ich habe früher an einem projekt in C++ gearbeitet, wo ich in einer funktion mit recht großen Arrays zu tun hatte, und dabei immer nur je 2 elemente in einer schleife bearbeiten sollte. Dabei hab ich einfach 2 Pointer auf die entsprechenden Elemente der Arrays eingestellt und mit dennen gearbeitet, um nicht immer sowas wie Arr[i][x][2] zu schreiben.

    Natürlich könnte man es auch einfach in spezielle variablen zwischenspeichern, und am ende der schleife die daten wieder in den array legen, aber wenn man in der schleife auch funktionen aufrufen muss, die dieses Array als parameter bekommen, wirds wieder nicht schön..

    Und ich frage mich, wie man das in C# am schönsten und schnellsten machen kann (denn wenn ich die variabeln in Objekte packe - verliere ich an performance).



  • Hallo,

    vielleicht hilft dir folgender Codeschnipsel weiter? Mit ein bisschen Operatoren überladen dürfte das einen Ersatz bieten..

    class MyArray
    {
        private int [][][] _array; // geht das so?
    
        private MyPointer GetPointer (int x, int y, int z)
        { get { return new MyPointer (_array, x, y, z); } }
    
        public MyArray (int sizeX, int sizeY, int sizeZ) { .. }
    }
    
    class MyPointer
    {
        private int _workWithX,_workWithY,_workWithZ;
        private int[][][] _array;
    
        public MyPointer (int [][][]array, int workWithX, int workWithY, int workWithZ)
        {
         // store parameters
        }
    
        public void Set (int val)
        { 
             _array[_workWithX][_workWithY][_workWithZ] = val;
        }
    
        public Get 
       { get { return _array[_workWithX][_workWithY][_workWithZ]; } }
       }
    }
    
    // Verwendung so: 
    MyArray arr = new MyArray (100, 50, 2);
    MyPointer ptr1 = arr.getPointer (23, 42, 2);
    MyPointer ptr2 = arr.getPointer (23, 42, 1);
    
    if (ptr1.get() > ptr2.get())
       ptr1.set (134);
    


  • Eine gute Idee, das passt 🙂 (obwohl wiederum performace leidet, aber naja)

    Ich nehme also an - wenn man schnelles Programm schreiben will - sollte man von unsafe code nicht zurückschrecken..

    ⚠ Danke sehr! 🙂



  • Wird beim unsafe Code nicht auch das Boundschecking für Arrays deaktiviert? Wenn du *genau* weißt, wie du auf deine Daten zugreifen wirst, schau mal ob du das noch deaktivieren kannst?



  • Zieh es auch in Erwägung, ein mehrdimensionales Array zu verwenden, sieht dann so aus: int[,,] für ein 3dimensionales.


Anmelden zum Antworten