Учебно-методический комплекс по дисциплине «б в. 7»






НазваниеУчебно-методический комплекс по дисциплине «б в. 7»
страница7/11
Дата публикации04.12.2014
Размер1.36 Mb.
ТипУчебно-методический комплекс
top-bal.ru > Информатика > Учебно-методический комплекс
1   2   3   4   5   6   7   8   9   10   11
^

Краткие теоретические сведения


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

• сама программа пользователя;

• системные программы времени выполнения, которые осуществляют вспомогательные действия при работе программы пользователя;

• определяемые пользователем структуры данных и константы;

• точки возврата для подпрограмм;

• временная память для хранения промежуточных результатов при вычислении выражений;

• временная память при передаче параметров и т.п.

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

Указатели


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

Таким образом, указатель - это переменная, которая в качестве своего значения содержит адрес первого байта памяти, по которому записаны данные. Сам по себе указатель занимает в памяти всего четыре байта, а данные, на которые он указывает, могут простираться в памяти на десятки килобайт. Переменной, на которую указывает указатель, не обязательно присваивать какое-либо имя. К ней можно обращаться через имя указателя, потому она называется ссылочной переменной.
^

Типизированные указатели


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

Для объявления типа указателя Р на целочисленный тип данных следует записать:

^ Type Р = ^Integer;

Тип Integer в данном примере является базовым типом. Имея в программе определение типа указателей (ссылочного типа), можно по общим правилам описать переменные этого типа. При этом ссылочные типы в описаниях переменных можно задавать как посредством идентификаторов, так и явно, например:

^ Var

Р1, Р2 : Р; {Тип Р введен выше}

R : ^Byte;

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

Например:

RecPtr = ^RecordType;

RecordType=record

Name : string[20];

Number : integer;

end;

В данном примере RecPtr описывается как указатель на переменную RecordType. Базовый тип RecordType описывается в той же самой последовательности определений типов, что и тип RecPtr.

Реально значения ссылочных типов (указателей) содержат адреса расположения в памяти конкретных значений базового типа. В персональном компьютере адреса задаются совокупностью двух шестнадцатиразрядных слов, которые называются сегментом и смещением. Сегмент - это участок памяти, имеющий длину 65536 байт (64 Кбайт) и начинающийся с физического адреса, кратного 16 (0, 16, 32, 48 и т.д.). Смещение указывает, сколько байт от начала сегмента необходимо пропустить, чтобы обратиться к нужному адресу. Таким образом, по своей внутренней структуре любой указатель представляет собой совокупность двух слов (данных типа Word), трактуемых как сегмент и смещение.

Абсолютный адрес образуется следующим образом: сегмент* 16+смещение.

Для того чтобы присвоить переменной ссылочного типа некоторое значение, можно воспользоваться унарной операцией взятия указателя, которая строится из знака этой операции-символа @ (амперсант) и одного операнда-переменной. Например, если имеется описание переменной I целого типа:

^ Vаr I : integer;

то применение этой операции к переменной I: @I дает в качестве результата значение типа указатель на целое. Аналогичный результат получится и в результате операции Р = ^Integer;

^ Операция взятия указателя допустима для любых переменных, в том числе для элементов массивов, полей записи и т. д.

Например, если есть описание:

Var А : array[1..10] of integer;

то конструкция @А[I] имеет смысл указателя на I-е целое в массиве А и также может участвовать в присваивании: Р := @А[I].

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

Среди всех возможных указателей в Турбо Паскале выделяется один специальный указатель, который "никуда не указывает". Можно представить такую ситуацию: в адресном пространстве оперативной памяти компьютера выделяется один адрес, в котором заведомо не может быть размещена никакая переменная. На это место в памяти и ссылается такой нулевой (или пустой) указатель, который обозначается словом Nil. Указатель Nil считается константой, совместимой с любым ссылочным типом, поэтому его значение можно присваивать любому указателю. Обычно значение Nil присваивают указателю, когда его указание надо отменить или в начале инициализации программы. Это позволяет проверять значение указателя, прежде чем присваивать ему какое-либо значение.
^

Нетипизированный указатель (pointer)


В Турбо Паскале можно объявлять указатель и не связывать его при этом с каким-либо конкретным типом данных. Для этого служит стандартный тип Pointer. Он обозначает нетипизированный указатель, т. е. указатель, который не указывает ни на какой определенный тип. С помощью нетипизированных указателей удобно динамически размещать данные, структура и тип которых меняются в ходе программы.

Переменные типа ^ Pointer не могут быть разименованы: указание символа ^ после такой переменной вызывает появление ошибки. Как и значение, обозначаемое словом Nil, значения типа Pointer совместимы со всеми другими типами указателей.

Над значениями ссылочных типов допускаются две операции сравнения на равенство и неравенство, например @Х <> @Y или Р1 = Р2.

Два указателя равны только в том случае, если они ссылаются на один и тот же объект.
^

Доступ к переменной по указателю


Для доступа к переменной имеются две возможности: первая - использовать идентификатор переменной, вторая - воспользоваться адресом этой переменной, который содержится в указателе на эту переменную.

Например, чтобы увеличить значение переменной ^ I, на которую указывает указатель Р: по первому способу можно записать: I:=I+2.Для реализации второго, косвенного доступа к переменной по указателю, используется разыменование указателя. Правило разыменования таково: для того чтобы по указателю на переменную получить доступ к самой переменной, нужно после переменной-указателя поставить знак ^. Так, запись: Writeln(Int2^) означает напечатать значение переменной, на которую ссылается указатель Int2. Поэтому чтобы увеличить значение переменной I, на которую указывает указатель Р, используя косвенный доступ к переменной по указателю, можно записать: Р ^:= P^ + 2.

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

Управление динамической памятью


Вся динамическая память в Турбо Паскале рассматривается как сплошной массив байтов, который называется кучей. Физически куча располагается в старших адресах сразу за областью памяти, которую занимает тело программы.

Начало кучи хранится в стандартной переменной ^ HeapOrg, конец - в переменной HeapEnd. Текущую границу незанятой динамической памяти указывает указатель HeapPtr.

Для управления кучей используются следующие стандартные процедуры и функции.
^

Процедуры динамического распределения


Dispose Уничтожает динамическую переменную

FreeMem Уничтожает динамическую переменную данного размера

GetMem Создает новую динамическую переменную заданного размера и устанавливает переменную-указатель для нее

Mark Записывает в переменной-указателе состояние кучи

New Создает новую динамическую переменную и устанавливает на нее переменную-указатель

Release Возвращает кучу в заданное состояние

^ Функции динамического распределения

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

MemAvail Возвращает количество имеющихся в куче свободных байтов

Функции для работы с указателями и адресами

Addr Возвращает адрес заданного объекта

Cseg Возвращает текущее значение регистра CS

Dseg Возвращает текущее значение регистра DS

Ofs Возвращает смещение заданного объекта

Ptr Преобразует базовый адрес сегмента и смещение в значение типа указатель

Seg Возвращает сегмент для заданного объекта

SPtr Возвращает текущее значение регистра SP

Sseg Возвращает текущее значение регистра SS

Основные действия над динамическими переменными - создание и уничтожение - реализуются в Турбо Паскале стандартными процедурами New и Dispose.

Процедура New предназначена для создания динамических переменных определенного типа. Она отводит новую область памяти в куче для данной динамической переменной и сохраняет адрес этой области в переменной-указателя. Можно присвоить значение переменной-указателю и с помощью оператора @ или функции Ptr. Оператор @ устанавливает переменную-указатель на область памяти, содержащую существующую переменную, включая и те переменные, которые имеют идентификаторы. Функция Ptr устанавливает переменную-указатель на определенный адрес в памяти. Например:

New(Int1);

P1 := @X;

Ptr($40, $49);

Для освобождения памяти в куче предназначена процедура Dispose с параметром указатель на динамическую переменную, причем эта переменная должна быть ранее размещена в куче посредством New, а тип размещенной переменной должен совпадать с базовым типом параметра процедуры Dispose. Например: Dispose(Int1) освобождает выделенный в предыдущем примере в куче фрагмент памяти так, что его можно снова использовать, если потребуется.

Если в программе не предполагается использование кучи, то при работе с программой Турбо Паскаля рекомендуется снизить потребность в памяти для создаваемой программы с помощью меню Options/Heap.

При освобождении динамической памяти нужно соблюдать осторожность, т.е. пользоваться либо New/Dispose, либо New/Mark/Release, либо GetMem/FreeMem, но ни в коем случае не путать сочетание этих процедур.
^

Пример программы с использованием динамической памяти


{Программа указателя на массив, доступа к элементам массива}

Program Point1;

Uses Crt;

Type

massiv=array[1..10] of integer; {описание типа массива из 10 целых чисел}

Var

i:integer;

a:massiv; {массив из 10 целых чисел}

PtrMas:^massiv;{указатель на массив}

Begin

{ввод элементов массива}

Writeln('Введите элементы массива : ');

for i:=1 to 10 do

begin

Writeln(i,'-й элемент массива ');

Readln(a[i]);

end;

ClrScr;

Writeln('Введенный массив: ');
{вывод элементов введенного массива }

for i:=1 to 10 do

Write(' ',a[i]);

Writeln;

{Присвоить указателю PtrMas адрес начала размещения массива в памяти}

PtrMas:=@a;

Writeln('Значение первого элемента массива, на который указывает PtrMas: ');

{Напечатать значение первого элемента массива, на который указывает указатель PtrMas}

Writeln(PtrMas^[1]);

{Присвоить указателю PtrMas  адрес начала размещения второго элемента массива}

PtrMas:=@a[2];

Writeln(' Значение второго элемента массива, на который указывает указатель PtrMas: ');

{Напечатать значение первого элемента массива, на который указывает указатель PtrMas}

Writeln(PtrMas^[1]);

Writeln(' Значение 4-того элемента массива, на который указывает указатель PtrMas: ');

{Присвоить указателю PtrMas адрес 4-того элемента массива}

PtrMas:=Ptr(Seg(a[3]),Ofs(a[3])+SizeOf(integer));

{Ptr- преобразует базовый адрес сегмента и смещения в значение типа указатель}

{Напечатать значение 1 элемента массива, на который указывает указатель PtrMas}

Writeln(PtrMas^[1]);

Readkey;

end.
1   2   3   4   5   6   7   8   9   10   11

Похожие:

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс курс по выбору по дисциплине « дв4»
Учебно-методический комплекс по дисциплине " Технические и аудиовизуальные средства обучения"

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине « Б2»
Учебно-методический комплекс (далее умк) по дисциплине «Информатика» разработан в соответствии с требованиями фгос впо к обязательному...

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине Инженерная графика
Данный учебно-методический комплекс рассмотрен и утвержден на заседании Учебно-методической комиссии роат. Протокол №4 от 01. 07....

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине Инженерная графика
...

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине «Информатика»
Учебно-методический комплекс по дисциплине «Использование современных информационных и коммуникационных технологий» разработан в...

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине «Информатика»
Учебно-методический комплекс по дисциплине «Использование современных информационных и коммуникационных технологий» разработан в...

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине « дв12»
Учебно-методический комплекс по дисциплине " Технические и аудиовизуальные средства обучения"

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине « дв32»
Учебно-методический комплекс по дисциплине " Технические и аудиовизуальные средства обучения"

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине по выбору Б3
Учебно-методический комплекс по дисциплине «Логическое программирование» разработан в соответствии с требованиями фгос впо к обязательному...

Учебно-методический комплекс по дисциплине «б в. 7» iconУчебно-методический комплекс по дисциплине « В. 3»
Учебно-методический комплекс (далее умк) по дисциплине «Профессиональные компьютерные программы» разработан в соответствии с требованиями...



Школьные материалы


При копировании материала укажите ссылку © 2018
контакты
top-bal.ru

Поиск