- •8. Указатели
- •8.1. Выражения указателей
- •8.1.1. Получение значения переменной указателя
- •8.1.2. Получение адреса переменной
- •Int number;
- •8.1.3. Доступ к члену структуры с использованием указателя
- •8.1.4. Доступ к элементу массива с использованием указателя
- •8.1.5. Операции инкремента и декремента над указателями
- •8.1.6. Арифметические операции над указателями
- •8.1.7. Сравнение указателей
- •8.1.8. Использование указателей для копирования массива байтов
8.1.3. Доступ к члену структуры с использованием указателя
Пример использования оператора доступа к члену структуры (p – это указатель на структуру содержащую член x):
Coords* p = &home;
p -> x = 25; // Оператор доступа к члену ->
Примечание. Выражение
p->x эквивалентно выражению (*p).x
, поэтому, используя любое из них можно
получить одинаковый результат.
Пример 8.3. Объявление структуры Coords, содержащей две координаты x и y, и создание ее экземпляра. С помощью оператора доступа к членам -> и указателя на экземпляр home координатам x и y присваиваются значения.
// Компилировать с /unsafe
struct Coords
{ public int x;
Public int y;
}
class AccessMembers
{ static void Main()
{ Coords home;
unsafe
{ Coords* p = &home;
p->x = 25;
p->y = 12;
System.Console.WriteLine("Координаты: x={0}, y={1}",
p->x, p->y);
}
System.Console.ReadLine();
}
}
// Вывод: Координаты: x=25, y=12
8.1.4. Доступ к элементу массива с использованием указателя
Получение доступа к элементу массива в памяти посредством доступа к элементу указателя.
char* charPointer = stackalloc char[123];
for (int i = 65; i < 123; i++)
charPointer[i] = (char)i; // Доступ к элементу массива
Примечание. Выражение charPointer[i] эквивалентно выражению *(charPointer + i) , поэтому, используя любое из них можно получить одинаковый результат.
Пример 8.4. Назначение 123-х областей памяти массиву символов charPointer. Массив используется для отображения букв нижнего и верхнего регистра в двух циклах for.
// Компилировать с /unsafe
class Pointers
{ unsafe static void Main()
{ char* charPointer = stackalloc char[123];
for (int i = 65; i < 123; i++) charPointer[i] = (char)i;
// Вывод букв верхнего регистра:
System.Console.Write("Буквы верхнего регистра: ");
for (int i = 65; i < 91; i++)
System.Console.Write(charPointer[i]);
System.Console.WriteLine();
// Вывод букв нижнего регистра:
System.Console.Write("Буквы нижнего регистра: ");
for (int i = 97; i < 123; i++)
System.Console.Write(charPointer[i]);
System.Console.WriteLine();
System.Console.ReadLine();
}
}
/* Вывод:
Буквы верхнего регистра: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Буквы нижнего регистра: abcdefghijklmnopqrstuvwxyz
*/
8.1.5. Операции инкремента и декремента над указателями
Пример 8.5. Перемещение по массиву путем увеличения значения переменной указателя. После выполнения каждого шага отображается содержимое и адрес элемента массива.
// Компилировать с /unsafe
class PointerIncrement
{ unsafe static void Main()
{ int[] numbers = {0,1,2,3,4};
fixed (int* p1 = numbers) // Назначение указателя на массив
{ for (int* p2 = p1; p2 < p1 + numbers.Length; p2++)
System.Console.WriteLine("Значение: {0} @ Адрес: {1}",
*p2, (long)p2);
}
System.Console.ReadLine();
}
}
/* Вывод:
Значение: 0 @ Адрес: 20076952
Значение: 1 @ Адрес: 20076956
Значение: 2 @ Адрес: 20076960
Значение: 3 @ Адрес: 20076964
Значение: 4 @ Адрес: 20076968
*/
