Поделиться через


Объявления указателей

Объявление указателя именует переменную указателя и задает тип объекта, на который указывает переменная. Переменная, объявленная как указатель, содержит адрес памяти.

Синтаксис

declarator:
pointerнеоб.direct-declarator

direct-declarator:
identifier
( declarator )
direct-declarator[constant-expressionopt]
direct-declarator ( parameter-type-list )
direct-declarator(identifier-listopt)

pointer:
*type-qualifier-listнеоб.
*type-qualifier-listнеоб.pointer

type-qualifier-list:
type-qualifier
type-qualifier-list type-qualifier

задает type-specifier тип объекта , который может быть любым базовым, структурным или типом объединения. Переменные указателя также могут указывать на функции, массивы и другие указателям. (Дополнительные сведения об объявлении и интерпретации более сложных типов указателей см. в разделе Интерпретация более сложных деклараторов.)

Создавая type-specifiervoid, можно отложить спецификацию типа, на который ссылается указатель. Этот элемент называется "указатель на 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 определения типа.

См. также

Деклараторы и объявления переменных