Адреса в персональных компьютерах состоят из двух шестнадцатеричных слов – адреса сегмента и смещения. Сегмент может начинаться только с физического адреса кратного 16. Смещение показывает положение участка памяти относительно начала сегмента. Задав нужное смещение, можно обратиться к любому байту данного сегмента.
10.Тип данных указатели. Назначение указателей. Указатели, типизированные и не типизированные: объявление переменных типа указатель, операции выделения и освобождения памяти, операция разыменования.
Для работы с динамической памятью в Турбо Паскале, как и во многих других языках, используются указатели. Указатель занимает четыре байта и содержит в двух старших байтах значение адреса сегмента, а в двух младших – смещение. С помощью указателей можно размещать в динамической памяти переменные любых типов. Указатель в этом случае будет ссылаться на первый байт области памяти, выделенной переменной.
В Паскале имеется два вида указателей: типизированные и нетипизированные.
Типизированный указатель – это указатель на переменную определенного типа (целого, строкового, массив, запись и др.). Переменная, содержащая типизированный указатель, описывается с помощью следующей конструкции:
Var <имя переменной-указателя>:^<имя базового типа>;
Нетипизированный указатель – адрес первого байта области памяти, в которой может размещаться информация любого типа. Переменная, содержащая нетипизированный указатель, описывается с помощью следующей конструкции:
Var <имя переменной-указателя>: pointer;
Var p1:^ integer; {указатель на переменную целого типа}
p2:^string; {указатель на строку}
p3: pointer; {нетипизированный указатель}
Нетипизированный указатель pointer совместим со всеми типами указателей.
Указатель размещается в сегменте данных (или в стеке – для параметров подпрограмм) и занимает 4 байта. Сами же переменные размещаются в динамической памяти – heap («куча»). Следует помнить, что:
динамические переменные являются переменными с управляемым временем жизни. Их время жизни длится от момента создания до момента уничтожения, и управляет этим процессом программа;
по окончании работы программы вся выделенная для нее память, в том числе и куча, освобождается;
следует своевременно удалять созданные в ходе выполнения программы динамические переменные, чтобы программа не «ела память».
Для размещения данных в динамической памяти (для создания динамических переменных) используются процедуры New и GetMem.
New(p) – используется для типизированных указателей.
При выполнении этой процедуры в динамической памяти выделяется столько байтов, сколько требуется для хранения переменной данного типа. При этом указателю p присваивается адрес первого байта выделенной памяти.
GetMem(p, Size) – используется для нетипизированных указателей.
Параметр Size задает размер памяти в байтах, которую необходимо выделить (в 16-разрядных компиляторах размер Size не может превышать 64 Кбайта). Например, GetMem(p, 100) выделяет для хранения данных, на которые указывает переменная p, ровно 100 байт, а указатель p получает значение адреса первого байта выделенной области.
При попытке обращения к памяти по указателям, для которых не выделена память, может привести к сбоям в работе программы вплоть до зависания компьютера.
Всегда сохраняйте программу перед запуском!
Указатели получают свои значения только после выполнения процедур выделения памяти или обнуления. Для обнуления указателя ему присваивают «пустое» значение – nil, не указывающее ни на какое место в памяти.
Следует иметь в виду, что динамические переменные не имеют собственного имени: в процедурах выделения памяти задается не имя переменной, а указатель на нее.
Для обращения к самим переменным используется операция разыменования указателя – записывается с помощью знака ^ после имени указателя:
<имя указателя>^
Например: p1^:=5; p2^:=’Privet’; pmas^[3]:=5.6;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.