2013-04-10 16 views
9

Jak rozumieć, zgodnie z MSDN C# stałej oświadczenie powinno działać jak:niebezpieczne stwierdzenie wskaźnik ciąg

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

tak, to dlaczego ja `t to zrobić?

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

Jak mogę uzyskać wskaźnik do str[1], na przykład?

+0

Jakiego błędu dostałeś? –

+0

błąd podczas kompilacji: nie może zająć adresu podanego wyrażenia –

+0

możliwy duplikat [Nie można pobrać adresu podanego wyrażenia \t C# wskaźnik] (http://stackoverflow.com/questions/5079736/cannot-take-the- address-of-the-given-expressionc-pointer) –

Odpowiedz

4

Jest tak, ponieważ operator [] na łańcuchu jest metodą, która zwraca wartość. Zwracana wartość z metody, gdy jest to pierwotny typ wartości, nie ma adresu.

[] operator w C# nie jest taka sama jak [] w C w C, tablice i ciągi znaków są tylko wskazówki, i stosując [] operatora na wskaźnik, jest odpowiednikiem przesuwając kursor i wyłuskania go. To nie działa w języku C#.

Właściwie wystąpił błąd w dokumentacji MSDN ty powiązane, które zostały ustalone w latest version.

Zobacz here więcej o dokładnym wyjaśnieniem tej sprawy.

+0

"Zwracane wartości z metod nie mają adresu." nie jest do końca prawdą - tak się złożyło, że powrót 'string [int]' to 'char', który nie jest typem, który można" naprawić ". –

1

Celem instrukcji fixed jest zapobieganie przemieszczaniu się pamięci w pamięci wirtualnej. Alokacja pamięci jest identyfikowana przez jej początek, a nie przez jakikolwiek inny adres.

Tak więc, aby naprawić &str[1] naprawę, naprawdę trzeba naprawić cały str; następnie możesz użyć arytmetyki wskaźnika, aby wyprowadzić inne wskaźniki w ramach pojedynczej alokacji ze wskaźnika stałego do str, według własnego uznania.

0

Zmień swój kod do tego:

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

Daje to adres, który wskazuje na lokalizację pamięci zawierającą pierwszy znak, ale nie można go użyć do uzyskania dostępu do innych znaków ciągu. –

7

Od uzyskania wskaźnik do późniejszego elementu bezpośrednio współpracuje z tablicami, ale nie ze strun wydaje się, że jedynym powodem jest to, że MS nie realizować go. Łatwo byłoby zaprojektować go w ten sposób, zgodnie z semantyką tablic.

Ale można łatwo obliczyć inny wskaźnik wskazujący na inne elementy tablicy. Więc nie jest to duży problem w praktyce:

fixed (char* p = str) 
{ 
    char* p1 = p+1; 
} 
Powiązane problemy