2013-04-10 1 views
9

Как я понял, в соответствии с MSDN C# фиксированного заявление должны работать как:небезопасной Строка оператор указателя

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

так, почему я не могу это сделать?

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

Как я могу получить указатель на str[1], для примера?

+0

Какая ошибка вы получаете? –

+0

ошибка времени компиляции: не может принимать адрес данного выражения –

+0

Возможный дубликат [Невозможно принять адрес данного выражения \t C# указатель] (http://stackoverflow.com/questions/5079736/cannot-take-the- адрес-of-the-given-expressionc-pointer) –

ответ

4

Это потому, что оператор [] в строке представляет собой метод, который возвращает значение. Возвращаемое значение из метода, когда оно является примитивным типом значения, не имеет адреса.

[] оператор в C# не то же самое, как [] в C. В C, массивы и строки символов являются только указатели, и применяя [] оператора на указатель, эквивалентно перемещению указателя и разыменования его. Это не выполняется в C#.

На самом деле произошла ошибка в документации MSDN вы связаны, что фиксируется в latest version.

См here для более подробного объяснения по этому вопросу точной.

+0

«Возвращаемые значения из методов не имеют адреса». не совсем верно - только что случилось, что return 'string [int]' is 'char', который не является типом, который может быть« исправлен ». –

1

Точка инструкции fixed предназначена для предотвращения перемещения памяти из виртуальной памяти. Распределение памяти определяется по ее началу, а не по другому адресу.

Таким образом, чтобы сохранить &str[1] исправленный, вам действительно нужно полностью str исправлено; вы можете использовать арифметику указателя для вывода других указателей в пределах одного выделения из фиксированного указателя в str, как вы пожелаете.

0

Измените код следующим образом:

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

Это дает адрес, указывающий на ячейку памяти, которая содержит первый символ, но не может использоваться для доступа к другим символам строки. –

7

После получения указателя на более поздний элемент непосредственно работает с массивами, но не со строками кажется, что единственная причина в том, что MS не реализовать. Было бы легко спроектировать его таким образом, следуя семантике массивов.

Но вы можете легко вычислить другой указатель, который указывает на другие элементы массива. Так что это не является большой проблемой на практике:

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