
- •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. Указатели
(http://msdn.microsoft.com/ru-ru/library/y31yhkeb.aspx)
Формат объявления указателя:
тип* идентификатор;
Примеры объявлений указателей различных типов:
int* p // p - указатель на целое число
int** p // p - указатель на указатель на целое число
int*[] p // p - одномерный массив указателей на целые числа
char* p // p - указатель на символ
void* p // p - указатель на неизвестный тип
Примеры объявления нескольких указателей в одном объявлении:
int* p1, p2, p3; // Правильное объявление указателей
int *p1, *p2, *p3; // Неправильное объявление указателей
Пример использования косвенного оператора указателя * для доступа к содержимому, на которое указывает переменная указателя:
int* myVariable;
Выражение *myVariable означает переменную типа int, находящуюся по адресу, содержащемуся в myVariable.
Таблица 1. Операторы, используемые с указателями
Оператор |
Применение |
* |
Косвенный оператор указателя. |
–> |
Доступ к члену структуры через указатель. |
[ ] |
Индексирование указателя. |
& |
Получение адреса переменной. |
+ + и – – |
Приращение и уменьшение указателей. |
Оператор + и – |
Арифметические действия указателя. |
==, !=, <, >, <= и >= |
Сравнение указателей. |
stackalloc |
Выделение памяти в стеке. |
Оператор fixed |
Временная фиксация переменной, чтобы можно было найти ее адрес. |
8.1. Выражения указателей
8.1.1. Получение значения переменной указателя
Пример использования косвенного оператора указателя для получения переменной, адрес которой содержится в указателе (где p – указатель):
*p;
Пример 8.1. Получение доступа к переменной типа char указателями различных типов.
// Компилировать с /unsafe
unsafe class TestClass
{ static void Main()
{ char theChar = 'Z';
char* pChar = &theChar;
void* pVoid = pChar;
int* pInt = (int*)pVoid;
System.Console.WriteLine("Значение theChar = {0}", theChar);
System.Console.WriteLine("Адрес theChar = {0:X2}", (int)pChar);
System.Console.WriteLine("Значение pChar = {0}", *pChar);
System.Console.WriteLine("Значение pInt = {0}", *pInt);
System.Console.ReadLine();
}
}
/* Вывод:
Значение theChar = Z
Адрес theChar = 3EDECC4
Значение pChar = Z
Значение pInt = 90
*/
8.1.2. Получение адреса переменной
Использование оператора получения адреса &:
Int number;
int* p = &number; // Операция получения адреса &
Пример 8.2. Объявление указателя на int p и ему присваивается адрес целочисленной переменной number.
// Компилировать с /unsafe
class AddressOfOperator
{ static void Main()
{ int number;
unsafe
{ int* p = &number; // Назначение адреса числа указателю
*p = 0xffff; // Комментирование удаляет инициализацию числа
System.Console.WriteLine("Значение, на которое указывает p:"
+ " {0:X}", *p);
System.Console.WriteLine("Адрес, сохраненный в p: {0}",
(int)p);
}
System.Console.WriteLine("Значение переменной number: {0:X}",
number);
System.Console.ReadLine();
}
}
/* Вывод:
Значение, на которое указывает p: FFFF (после комментария – 0)
Адрес, сохраненный в p: 63827140
Значение переменной number: FFFF (после комментария – 0)
*/