Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика - лекции.doc
Скачиваний:
18
Добавлен:
07.11.2018
Размер:
512.51 Кб
Скачать

Указатели.

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

Обычно указатель указывает на данные определенного типа. Расмотрим следующий пример:

type

Buffer = string[255];

BufPtr = ^Buffer;

var

Buf1: Buffer;

Buf2: BufPtr;

Тип данных Buffer определен, как строковая переменная размером 255 байт, в то же время BufPtr - указатель на Buffer. Переменная Buf1 имеет тип Buffer и занимает (255+1) байт памяти. Переменная Buf2 имеет тип BufPtr, это 32-битовый адрес и занимает 4 байта памяти.

Куда указывает Buf2? В данный момент никуда. Прежде чем использовать BufPtr, необходимо зарезервировать (распределить) память и запомнить ее адрес в Buf2. Вы делаете это, используя процедуру New:

New(Buf2);

Поскольку Buf2 указывает на тип Buffer, то этот оператор выделит в памяти 256-байтовый буфер и его адрес поместит в Buf2.

Как использовать Buf2 и данные, на которые он указывает? С помощью оператора ^. Например, необходимо поместить строку и в Buf1 и в буфер, на который указывает Buf2:

Buf1 : = 'Эта строка помещается в Buf1';

Buf2^: = 'Эта строка помещается по указателю Buf2';

Отметим различие между Buf2 и Buf2^:

Buf2 означает 4-байтовую переменную указателя;

Buf2^ -256-байтовую строковую переменую, адрес которой в Buf2.

Теперь, как освободить память, на которую указывает Buf2? Используя процедуру Dispose. Эта процедура освобождает память. После того, как при помощи Dispose освобождена память, следует присвоить указателю значение nil, т.е. указатель ни на что не указывает:

Dispose(Buf2);

Buf2 := nil;

Заметим, что значение nil присваивается указателю Buf2, а не Buf2^.

Идентификаторы.

До сих пор в примерах содержались идентификаторы переменных без описания ограничений и правил их образования. Рассмотрим их более подробно.

Имена, которые даются константам, типам данных, переменным, функциям, известны как идентификаторы.

Turbo Pascal имеет несколько правил образования идентификаторов. Краткое описание правил:

- Все идентификаторы начинаются с буквы или знака подчеркивания (a..z, A..Z, _). Последующими символами могут быть буква, знак подчеркивания, цифра (0-9). Другие символы недопустимы.

- Идентификаторы рассматриваются без учета регистров (прописные и строчные буквы не различаются). Это значит, что a..z тождественно A..Z. Например index тоже самое что и Index, и INDEX.

- Идентификаторы могут иметь различную длину, но используются только первые 63 символа.

Операторы.

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

Существует восемь типов операторов: присваивания, арифметические, побитовые, отношений, логические, над множествами, адресные и над строками.

Большинство операторов в Паскале бинарные, имеют два операнда; унарные операторы имеют один операнд.

Бинарные операторы имеют обычно алгебраическую форму, например а+b. Унарный оператор предшествует своему операнду, например -b.

В сложных выражениях порядок выполнения операций определяется правилами приоритета ( см. таблицу 2.3)

Таблица 2.3 Приоритет операторов.

Операторы

Приоритет

Категория

@, not

Первый (высший)

Унарные

*, /, div, mod, and, shl, shr

Второй

Мультипликативные

+, -, or, xor

Третий

Аддитивные

=, <>, <, >, <=, >=, in

Четвертый (низший)

Отношения

Операции равного приоритета выполняются слева направо, хотя компилятор может их перегруппировать для генерации оптимального кода.

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