Объявления указателей
Объявление указателя именует переменную указателя и задает тип объекта, на который указывает переменная. Переменная, объявленная как указатель, содержит адрес памяти.
Синтаксис
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
типа.