Типы указателей (руководство по программированию в C#)
Обновлен: Ноябрь 2007
В небезопасном контексте тип может быть типом указателя, типом значения или ссылочным типом. Объявления типа указателя выполняется одним из следующих способов:
type* identifier;
void* identifier; //allowed but not recommended
Любой из следующих типов может быть типом указателя.
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal или bool.
Любой тип enum.
Любой тип указателя.
Любой пользовательский тип структуры, содержащий поля только неуправляемых типов.
Типы указателей не наследуют от объектов, не существует преобразований между типами указателей и object. Кроме того, для указателей не поддерживается упаковка и распаковка. Впрочем, можно выполнять преобразования между различными типами указаний, а также между типами указателей и целыми типами.
При объявлении нескольких указателей в одном объявлении знак * записывается только с нижележащим типом, а не в качестве префикса с каждым именем указателя. Пример.
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
Указатель не может указывать на ссылку или на структуру, содержащую ссылки, поскольку для ссылки на объект невозможен сбор мусора, даже если на нее указывает указатель. Сборщик мусора не отслеживает наличие указателей любых типов, указывающих на объекты.
Значением указателя переменной типа myType* является адрес переменной типа myType. Ниже приведены примеры объявлений типов указателей.
Пример |
Описание |
---|---|
int* p |
p — указатель на целое число |
int** p |
p — указатель на указатель на целое число |
int*[] p |
p — одномерный массив указателей на целые числа |
char* p |
p — указатель на знак |
void* p |
p — указатель на неизвестный тип |
Косвенный оператор указателя * можно использовать для доступа к содержимому, на которое указывает переменная указателя. В качестве примера рассмотрим следующее объявление:
int* myVariable;
Выражение *myVariable обозначает переменную int, находящуюся по адресу, содержащемуся в myVariable.
Невозможно использовать косвенный оператор для указателя типа void*. Однако можно использовать приведение для преобразования указателя типа void в любой другой тип и наоборот.
Указатель может иметь значение null. При применении косвенного оператора к указателю со значением null результат зависит от конкретной реализации.
Обратите внимание, что при передаче указателей между методами может возникнуть непредусмотренное поведение. В примерах указатель возвращается в локальную переменную через параметр Out или Ref либо в виде результата функции. Если указатель был указан в фиксированном блоке, переменная, на которую он указывает, больше не может быть фиксированной.
В следующей таблице перечислены операторы, которые можно использовать для указателей в небезопасном контексте.
Оператор |
Действие |
---|---|
* |
Косвенный оператор указателя. |
-> |
Доступ к члену структуры через указатель. |
[] |
Индексирование указателя. |
& |
Получение адреса переменной. |
++ и -- |
Приращение и уменьшение указателей. |
+ и - |
Арифметические действия указателя. |
==, !=, <, >, <= и >= |
Сравнение указателей. |
stackalloc |
Выделение памяти в стеке. |
Оператор fixed |
Временная фиксация переменной, чтобы можно было найти ее адрес. |
Спецификация языка C#
Дополнительные сведения см. в следующем разделе документа Спецификация языка C#.
- 18 Небезопасный код
См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Небезопасный код и указатели (Руководство по программированию в C#)
Преобразования указателей (руководство по программированию в C#)
Выражения указателей (Руководство по программированию на C#)
Оператор fixed (Справочник по C#)
Упаковка-преобразование и распаковка-преобразование (Руководство по программированию на C#)