Урок 7.1.1. Описание указателей

7.1.1. Описание указателей

Указатель представляет собой переменную, значением которой является адрес памяти. Значение указателя "показывает" (отсюда и термин – указатель), по какому адресу памяти размещено некоторое данное, а из описания указателя известен тип этого данного.

Указатели описываются операторами вида:

<тип> *<объект1>,*<объект2>,...,*<объектN>;

где

<тип> – это любой, допустимый в Си тип данных; * звездочка говорит о том, что следующий за ней <объект> является объектом, указывающим на данное <тип>; <объект> в простейшем случае это <идентификатор> и тогда он представляет собой скалярную переменную, являющуюся указателем.

Более сложным объектом может быть <идентификатор> [<кол-во>]...[<кол-во>], и тогда идентификатор представляет собой имя n-мерного массива указателей, содержащего <кол-во> элементов по n-му измерению. Если в качестве объекта в оператор описания подставить конструкцию вида *<объект>, то тогда объект является указателем на указатель данного <тип>.
Если вправо от идентификатора объекта записаны парные пустые круглые скобки, то такой идентификатор является указателем на функцию. При описании указателей можно использовать круглые скобки для задания нужной интерпретации. Правила интерпретации сложных описаний будут рассмотрены чуть ниже, пока же исследуем простые примеры описаний,

 int *p1; p1 – указатель на данные целого типа.
 float *p2; p2 – указатель на данные с плавающей точкой.
 char *p3; p3 – указатель на символьные данные.
 int *p4[3]; p4 – массив указателей на данные целого типа, каждый из элементовкоторого p4[0], р4[1], p4[2] является указателем на целое.
 void *p5; p5 – указатель на данные, тип которых заранее не определен.
 char **p6 p6 – указатель на указатель данных типа сhar.

Более сложные примеры описания указателей:

 int (*fn)(); fn – указатель на функцию, возвращающую целое значение.
 char (*pt)[5]; pt – указатель на пятиэлементный массив символьных данных.
 int (*uk)[5][6]; uk – указатель на двухмерный массив данных целого типа размером 5 на 6.
 int *(*vc[10])(); vc – массив из десяти указателей на функции, возвращающие указатели нацелые значения.

При интерпретации сложных описаний квадратные скобки, задающие массив, и круглые пустые скобки, задающие функцию (и те и другие стоят справа от идентификатора) обладают приоритетом перед звездочкой (слева от идентификатора). Квадратные и круглые скобки имеют один и тот же приоритет и связываются слева направо. Тип данного, на который ссылается указатель, рассматривается на последнем шаге, когда объект уже полностью проинтерпретирован. Непустые круглые скобки используются для того, чтобы установить необходимый (и, естественно, допустимый в языке) порядок интерпретации. Для интерпретации сложных описаний данных вообще, в том числе и указателей, известно простое правило, называемое "изнутри наружу" и состоящее из четырех шагов.

1. Начать с идентификатора и посмотреть вправо, есть ли квадратные или круглые скобки.

2. Если они есть, то проинтерпретировать эту часть описания и затем посмотреть налево в поиске звездочки.

3. Если на любой стадии справа встретится закрывающая круглая скобка, то вначале необходимо применить все эти правила внутри круглых скобок, а затем продолжить интерпретацию.

4. Интерпретировать описатель типа.

Применим это правило для интерпретации последнего из вышеприведенных примеров:

 int * ( * vc[10] ) ();
 6  5    3  1   2     4

Цифрами показан порядок просмотра и интерпретации описания в соответствии с правилом: объявляется переменная vc (1) как массив из десяти (2) указателей (3) на функции (4), возвращающие указатели (5) на целые значения (6). И, наконец, последнее в этом разделе замечание по поводу описания указателей. Если мы хотим описать указатель, используя который нельзя изменить в программе значение данного, на которое он указывает, то можем использовать модификатор const. Например:

const char *p7;

Указателю p7 могут быть присвоены различные значения, но данные, на которые он указывает, не могут быть изменены.
 

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов