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


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

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

Синтаксис

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-specifiervoidэто, можно отложить спецификацию типа, к которому ссылается указатель. Такой элемент называется указателем на "указатель void" и записывается как void *. Переменная, объявленная в качестве указателя void , может использоваться для указания объекта любого типа. Однако для выполнения большинства операций с указателем или объектом, на который он указывает, тип, к которому он указывает, должен быть явно указан для каждой операции. (Переменные типа и типа char *void * совместимы с назначением без приведения типа.) Такое преобразование можно выполнить с помощью приведения типа. Дополнительные сведения см. в разделе Type-Cast Преобразования.

Это type-qualifier может быть либо либо const , либо volatileоба. Эти ключевые слова указывают соответственно, что указатель не может быть изменен самой программой (const), или что указатель может быть законно изменен некоторым процессом за пределами контроля программы (volatile). Дополнительные сведения и constvolatileсведения см. в разделе "Квалификаторы типов".

Имена 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 типа.

См. также

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