Указатели р и р2 содержат один и тот же адрес
Как следует из приведенного выше результата, выражения &nums[0]
И
nums
оказываются одинаковыми. Но поскольку вторая форма более лаконична, то она чаще используется в программировании, когда требуется указатель на начало массива.
Индексирование указателей
Когда указатель обращается к массиву, его можно индексировать как сам массив. Такой синтаксис служит более удобной в некоторых случаях альтернативой арифметическим операциям над указателями. Рассмотрим следующий пример программы.
// Проиндексировать указатель как массив.
using System;
class PtrlndexDemo {
unsafe static void Main() { int[] nums = new int [10];
// Проиндексировать указатель.
Console.WriteLine('Индексирование указателя как массива.'); fixed (int* p = nums) { for(int i=0; i < 10; i++)
p[i] = i; // индексировать указатель как массив
forjint i=0; i < 10; i++)
Console.WriteLine('p[{0}]: {1} ', i, p[i]);
}
// Использовать арифметические операции над указателями.
Console.WriteLine('ХпПрименение арифметических ' +
'операций над указателями.'); fixed (int* р = nums) { for(int i=0; i < 10; i++)
* (p+i) = i; // использовать арифметическую операцию над указателем
for(int i=0; i < 10; i++)
Console.WriteLine('*(p+{0}): {1} ', i, *(p+i));
}
}
}
Ниже приведен результат выполнения этой программы.
Индексирование указателя как массива.
Р[9] : 9
Применение арифметических операций над указателями.
*(р+0) : 0 *(P+1) : 1 *(р+2) : 2 *(р+3) : 3 *(р+4) : 4
* (р+5) : 5
* (р+6) : 6
* (р+7) : 7 *(р+8): 8
* (р+9) : 9
Как следует из результата выполнения приведенной выше программы, общая форма выражения с указателем
* (ptr + i)
может быть заменена следующим синтаксисом индексирования массива.
ptr[i]
Что касается индексирования указателей, то необходимо иметь в виду следующее. Во-первых, при таком индексировании контроль границ массива не осуществляется. Поэтому указатель может обращаться к элементу вне границ массива. И во-вторых, для указателя не предусмотрено свойство Length, определяющее длину массива. Поэтому, если используется указатель, длина массива зарайее неизвестна.
Указатели и строки
Символьные строки реализованы в C# в вид^объектов. Тем не менее отдельные символы в строке могут быть доступны по указателю. Для этого указателю типа char* присваивается адрес начала символьной строки в следующем операторе с модификатором fixed.
fixed(char*
