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.


Log in to reply