2013-04-10 7 views
9

Wie ich verstanden, nach MSDN C# feste Aussage wie funktionieren sollte:Unsafe Zeichenfolge Zeiger Anweisung

fixed (char* p = str) ... // equivalent to p = &str[0] 

so, warum ich `t dies tun?

const string str = "1234"; 
    fixed (char* c = &str[0]) 
    { 
/// ..... 
    } 

Wie kann ich Zeiger auf str[1], für ein Beispiel bekommen?

+0

Welchen Fehler bekommen Sie? –

+0

Fehler bei der Kompilierung: kann die Adresse des angegebenen Ausdrucks nicht annehmen –

+0

mögliches Duplikat von [Die Adresse des angegebenen Ausdrucks kann nicht übernommen werden \t C# -Zeiger] (http://stackoverflow.com/questions/5079736/cannot-take-the- address-of-the-given-expressionc-Zeiger) –

Antwort

4

Dies liegt daran, dass der Operator [] für die Zeichenfolge eine Methode ist, die einen Wert zurückgibt. Rückgabewert aus einer Methode, wenn es sich um einen primitiven Werttyp handelt, hat keine Adresse.

[] Operator in C# nicht dasselbe wie in [] C. In C ist, Arrays und Zeichenketten nur Zeiger sind, und [] Operator auf einem Zeiger angewendet wird, ist äquivalent den Zeiger zu bewegen und es zu dereferenzieren. Dies gilt nicht für C#.

Eigentlich ein Fehler in der MSDN-Dokumentation gibt es Ihnen verbunden ist, dass in den

here auf genau dieser Angelegenheit für weitere Erläuterungen siehe latest version.

fixiert ist.

+0

"Rückgabewerte von Methoden haben keine Adresse." ist nicht ganz richtig - es ist einfach passiert, dass die Rückgabe von 'string [int]' 'char 'ist, das kein Typ ist, der" fixiert "werden kann. –

1

Der Punkt der fixed Anweisung ist zu verhindern, dass eine Speicherzuweisung über den virtuellen Speicher verschoben wird. Die Speicherzuordnung wird durch ihren Anfang identifiziert, nicht durch irgendeine andere Adresse.

So zu &str[1] behoben, müssen Sie wirklich das ganze str behoben; Sie können dann Zeigerarithmetik verwenden, um andere Zeiger innerhalb der einzelnen Zuweisung vom festen Zeiger auf str wie gewünscht abzuleiten.

0

Code Um dies zu ändern:

char[] strC = "1234".ToArray(); 
fixed (char* c = &strC[0]) 
{ 
    /// ..... 
} 
+0

Dies gibt eine Adresse, die auf einen Speicherort verweist, der das erste Zeichen enthält, aber nicht für den Zugriff auf andere Zeichen der Zeichenfolge verwendet werden kann. –

7

Da einen Zeiger auf ein späteres Element zu erhalten direkt mit Arrays funktioniert, aber nicht mit Streichern wie es scheint, der einzige Grund ist, dass MS nicht umgesetzt hätte. Es wäre leicht möglich gewesen, es so zu gestalten, indem man der Semantik von Arrays folgt.

Aber Sie können leicht einen anderen Zeiger berechnen, der auf andere Array-Elemente zeigt. Es ist also kein großes Problem in der Praxis:

fixed (char* p = str) 
{ 
    char* p1 = p+1; 
} 
Verwandte Themen