Ответы на экзаменационные вопросы № 1-34 по дисциплине "Программирование" (Средства модульного программирования в системе Турбо-Паскаль. ООП. Объекты в динамической памяти), страница 17

Адреса в персональных компьютерах состоят из двух шестнадцатеричных слов – адреса сегмента и смещения. Сегмент может начинаться только с физического адреса кратного 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;