Объявления указателей
Объявление указателя именует переменную указателя и задает тип объекта, на который указывает переменная. Переменная, объявленная как указатель, содержит адрес памяти.
Синтаксис
declarator
:
pointer
необ.direct-declarator
direct-declarator
:
identifier
(
declarator
)
direct-declarator
[
constant-expression
opt]
direct-declarator
(
parameter-type-list
)
direct-declarator
(
identifier-list
opt)
pointer
:
*
type-qualifier-list
необ.
*
type-qualifier-list
необ.pointer
type-qualifier-list
:
type-qualifier
type-qualifier-list
type-qualifier
задает type-specifier
тип объекта , который может быть любым базовым, структурным или типом объединения. Переменные указателя также могут указывать на функции, массивы и другие указателям. (Дополнительные сведения об объявлении и интерпретации более сложных типов указателей см. в разделе Интерпретация более сложных деклараторов.)
Создавая type-specifier
void
, можно отложить спецификацию типа, на который ссылается указатель. Этот элемент называется "указатель на void
" и записывается как void *
. Переменная, объявленная как указатель на, void
может использоваться для указания на объект любого типа. Однако для того чтобы выполнять большинство операций с указателем или объектом, на который он указывает, тип, на который он указывает, должен быть явно задан для каждой операции. (Переменные типа char *
и типа void *
совместимы с назначением без приведения типа.) Такое преобразование можно выполнить с помощью приведения типа. Дополнительные сведения см. в разделе Преобразования приведения типов.
Может type-qualifier
быть либо const
, либо volatile
, либо и то, и другое. Эти ключевые слова указывают, соответственно, что указатель не может быть изменен самой программой (const
), или что указатель может быть изменен каким-либо процессом, не зависящим от программы (volatile
). Дополнительные сведения о ключевых словах const
и volatile
см. в статье Квалификаторы типов.
Именует declarator
переменную и может включать модификатор типа. Например, если declarator
представляет массив, тип указателя изменяется так, чтобы он был указателем на массив.
Можно объявить указатель на структуру, объединение или тип перечисления, прежде чем определять тип структуры, объединения или перечисления. Указатель объявляется с помощью структуры или тега union, как показано в примерах. Такие объявления разрешены, так как компилятору не нужно знать размер структуры или объединения, чтобы выделить место для переменной указателя.
Примеры
В следующих примерах показаны объявления указателей.
char *message; /* Declares a pointer variable named message */
Указатель message
указывает на переменную с char
типом .
int *pointers[10]; /* Declares an array of pointers */
Массив pointers
содержит 10 элементов; каждый элемент является указателем на переменную с int
типом .
int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */
Переменная pointer
указывает на массив с 10 элементами. Каждый элемент в этом массиве имеет тип int
.
int const *x; /* Declares a pointer variable, x,
to a constant value */
x
Указатель можно изменить так, чтобы он указывал на другое int
значение, но нельзя изменить значение, на которое он указывает.
const int some_object = 5 ;
int other_object = 37;
int *const y = &fixed_object;
int volatile *const z = &some_object;
int *const volatile w = &some_object;
Переменная y
в этих объявлениях объявляется как постоянный указатель на int
значение. Значение, на которое он указывает, можно изменить, но сам указатель всегда должен указывать на одно и то же расположение: адрес fixed_object
. Аналогичным z
образом является постоянным указателем, но он также объявляется для указания на int
объект , значение которого не может быть изменено программой. Описатель volatile
указывает, что, хотя значение объекта , const int
на которое z
указывает , не может быть изменено программой, оно может быть законно изменено процессом, выполняющимся параллельно с программой. Объявление w
указывает, что программа не может изменить указанное значение и что программа не может изменить указатель.
struct list *next, *previous; /* Uses the tag for list */
В этом примере объявляют две переменные указателя (next
и previous
), которые указывают на тип list
структуры . Это объявление может появиться перед определением list
типа структуры (см. следующий пример), если list
определение типа имеет ту же видимость, что и объявление.
struct list
{
char *token;
int count;
struct list *next;
} line;
Переменная line
имеет тип структуры с именем list
. Тип list
структуры имеет три элемента: первый элемент является указателем на char
значение, второй — int
значением, а третий — указателем на другую list
структуру.
struct id
{
unsigned int id_no;
struct name *pname;
} record;
Переменная record
имеет тип id
структуры . pname
объявляется как указатель на другой тип структуры с именем name
. Это объявление может появиться до name
определения типа.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по