Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
25.04.2015
Размер:
17.32 Кб
Скачать

Указатели

   Оперативная память ПК представляет собой совокупность элементарных ячеек для хранения информации - байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться к любому байту памяти.  Паскаль предоставляет в распоряжение программиста гибкое средство управления динамической памятью - так называемые указатели.

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

В ПК адреса задаются совокупностью двух шестнадцатиразрядных слов, которые называются сегментом и смещением. Сегмент - это участок памяти, имеющий длину (64 Кбайт) и начинающийся с физического адреса, кратного 16 (т.е. 0, 16, 32, 48 и т.д.). Смещение указывает, сколько байт от начала сегмента необходимо пропустить, чтобы обратиться к нужному адресу. 

Объявление указателей в ЯП Паскаль

Как правило, в Паскале указатель связывается с некоторым типом данных. Такие указатели будем называть типизированными. Для объявления типизированного указателя используется значок ^, который помещается перед соответствующим типом, например:

  • var

p1: ^integer;

р2: ^real;

В Паскале можно объявлять указатель и не связывать его при этом с каким-либо конкретным типом данных. Для этого служит стандартный тип POINTER, например:

  • var

р: pointer;

Указатели такого рода будем называть нетипизированными. Поскольку нетипизированные указатели не связаны с конкретным типом, с их помощью удобно динамически размещать данные, структура и тип которых меняются в ходе работы программы.  Как уже говорилось, значениями указателей являются адреса переменных в памяти, поэтому следовало бы ожидать, что значение одного укаателя можно передавать другому. На самом деле это не совсем так. В Паскале можно передавать значения только между указателями, связанными с одним и тем же типом данных. 

Разыменование и взятие указателей

Для взятия адреса используется унарный оператор @.

Для разыменования указателя используется оператор ^, который ставится сразу же после названия переменной указателя.

  • var

pinter_var: ^integer;

a: integer;

begin

pinter_var := @a; // взятие указателя на А

a := 10;

writeln(pinter_var^); // 10 - получение значения переменной А по указателю

readln;

end.

Операции над указателями

  1. Присваивание. Значение одного типизированного указателя можно присвоить другому указателю того же типа.

  2. К указателю можно прибавлять/вычитать целое число. Это приведет к тому, что он будет указывать на область памяти, смещенную на соответствующее количество байтов.

  3. Указатели можно вычитать. Например, если p1 указывает на первый элемент массива, а p2 на последний, то writeln(p2-p1); выведет количество элементов, расположенных между элементами, на которые указывают p1 и p2.