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

Билет 48. Ссылочные типы.

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

var Number:integer

Но можно найти этот адрес используя операнд @.

@Number Addr(Number)

Можно присвоить этот адрес типа Pointer - var P:Pointer;

Pointer – это нетипизированный указатель, т. е. он не имеет информации о том на какой тип указывает. Чаще удобней определять указатели на определенный тип (записи объекты). Чтобы определить указатели используется знак ^ за которым следует идентификатор типа.

Например определим указатель на тип Integer

Type pinteger=^integer Var X:Pinteger. А можно написать сразу Y:^Integer;

Cтавя ^ этот знак после идентификатора указателем можно получить то данное на которое этот указатель указывает. Например

NumAddress:Pinteger….. Number:=7;…… NumAddress:=@Number Writeln(Number); {7} Writeln(NumAddree^);{7}

Эта операция называется разименованием. Переменная типа Pointer не может быть разименованной. Среди всех возможных указателей в ТР выделяется один специальный, который никуда не указывает. Обозначается служебным словом nil. Указатель nil считается константой совместимой с любым ссылочным типом (переменная типа Pointer так же считается совместимой с любым ссылочным типом)

Размиенование считается некорректным если ссылочная переменная имеет значение nil. Предположим что у нас есть следующие определения

Type указатель = ^ объект

Важно понимать разницу между ссылкой и тем объектом на который она ссылается. Пусть есть P и Q типа указатель ссылающиеся на различные объекты.

Для описания ссылочных типов сделано одно исключение из общих правил – указатель на какой-либо тип может быть описан до объявления самого типа.

Пример

Type PTRMyType = ^ MyType; MyType = record X,y:Real; End;

Билет 49. Динамические структуры данных.

Различают статистические и динамические переменные. Например, к глобальным переменным память отводится в начале выполнения программы, и существуют они в течение всего периода работы программы. Для локальных переменных память отводится при вызове подпрограммы , а при выходе из нее она освобождается , то есть распределение памяти в обоих случаях производится автоматически. Помимо этого в Pascal существует возможность создавать и уничтожать переменные в любой момент работы программы, в зависимости от потребности задачи. Переменные, созданием и уничтожением которых может явно управлять программист называется динамическим. Динамическое распределение памяти активно используется в большом количестве приложений ( причины динамического распределения памяти):

- Управление большим объемом данных.

При объявлении глобальной переменной компилятор отводит ей место в сегменте данных, которые имеют размер 64 К, то есть все глобальные переменные должны иметь размер не более 64 К. Например, программа требует иметь массив из 400 элементов типа string по 100 символов. Этот массив приблизительно занял бы 40 К , а если нужно 2 массива, то они уже не поместятся в сегмент данных. То есть, необходимо использовать динамическую область памяти, которая называется Куча (heap) – это вся память, которую ваша операционная система делает доступной и которая не используется кодом программы, сегментом данных и сегментом стека. Размер Кучи необходимо контролировать различными способами.

-Управление данными неизвестного размера.

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

-Использование временных буферов данных.

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

-Динамические структуры данных.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]