Введение
Адресация динамических переменных происходит через указатели. В Паскале можно определить переменные, которые имеют тип указатель, их значения определяют адрес объекта. Для работы с динамическими переменными в программе должны быть предусмотрены:
выделение памяти под динамическую переменную;
присвоение указателю на динамическую переменную адреса выделенной памяти (инициализация указателя);
освобождение памяти после использования динамической переменной.
1. Указатели. Описание указателей
Указатели - это особый тип данных. В переменных этого типа хранятся адреса других переменных содержащих полезную для программы информацию. На первый взгляд может показаться, что использование указателей приводит к лишним затратам памяти и к усложнению программы, а также существе усложняет и сам процесс программирования. В данной главе мы, приведем такие примеры использования указателей, из которых станет ясно, что все дополнительные затраты на их хранение и обработку окупаются в полной мере. Работа с указателями предусмотрена не только в Pascal, но и в некоторых других языках программирования. Например, в языке С указатели используются практически в любой программе.
В Pascal роль указателей несколько скромнее, и, тем не менее, начинающим программистам следует усвоить базовые принципы работы с указателями, чтобы глубже понять внутренний механизм обработки и выполнения любой компьютерной программы.
2. Указатели и адреса
Известно, что адресом переменной является адрес первого байта ячейки памяти, которая под нее отводится. Для данных структурных типов (массивов и записей) их адресом считается адрес первого байта первого элемента.
В Turbo Pascal существует возможность прямого доступа к любому байту оперативной памяти по его адресу при помощи определенных в модуле system массивов Mem, MemW и MemL, которые позволяют записать информацию или прочитать ее непосредственно из ячеек памяти (один, два или четыре байта). Это очень опасные действия, поэтому они исключены в 32- разрядных системах программирования. Все же дадим краткие пояснения для тех, кто работает в среде Borland (Turbo) Pascal.
В качестве индекса в этих массивах используется адрес, записанный в виде, принятом в DOS: сегмент: Смещение относительно начала сегмента. Такой странный способ записи адреса связан с тем, что в операционной системе DOS вся память разбита на сегменты, размеры которых не превышают 64 Кбайт. Для получения абсолютного адреса из пары сегмент Смещение система прибавляет к сегменту справа шестнадцатеричный ноль (это четыре нуля в двоичной системе), а затем складывает его со смещением. Таким способом можно адресовать 1 Мбайт памяти.
Например, начальный адрес видеобуфера запишется в виде $B800:$000, а обратиться к самому первому его байту можно так:
Mem[$В800:$0000],
к первым двум байтам — MemW[$B800:$0000],
к первым четырем байтам — MemL [$B800:$0000]
Абсолютный адрес, соответствующий данной паре, — $B8000.
Еще один пример для любознательных — оператор mem[0:$41C]:=mem[0:$41А]; можно применить для принудительной очистки буфера клавиатуры. Здесь адрес маркера конца буфера клавиатуры приравнивается к адресу его начала. Конечно, в данном случае лучше воспользоваться средствами модуля crt.
Имеется еще один способ обращения к оперативной памяти — использование служебного слова absolute при описании переменной. ............