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


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

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

Синтаксис

declarator:
pointerнеоб. direct-declarator

direct-declarator:
identifier
( declarator )
direct-declarator [ constant-expressionнеоб. ]
direct-declarator ( parameter-type-list )
direct-declarator ( identifier-listнеоб. )

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 представляет массив, тип указателя изменяется, чтобы он был указателем на массив.

Можно объявить указатель на структуру, объединение или тип перечисления, прежде чем определять тип структуры, объединения или перечисления. Указатель объявляется с помощью тега структуры или объединения, как показано в примерах. Такие объявления разрешены, так как компилятору не нужно знать размер структуры или объединения, чтобы выделить пространство для переменной указателя.

Примеры

В следующих примерах показаны объявления указателей.

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 типа.

См. также

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