Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Топ:
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
памяти MS DOS
Оперативная память представляет собой совокупность элементарных ячеек для хранения информации – байтов, каждый из которых имеет свой собственный номер, называемый адресом. Адрес позволяет обращаться к любому байту памяти. Структура адреса MS DOS – это два 16-разрядных слова типа WORD, которые трактуются как сегмен т и смещение внутри сегмента. Сегмент – это участок памяти, имеющий длину 65536 байт (64 Кбайт = 216 байт) и начинающийся с физического адреса, кратного 16 (т.е. 0, 16, 32 и т.д.). Смещение указывает, на каком расстоянии от начала сегмента находится нужный байт памяти. Таким образом, любая ячейка адресного пространства определяется парой чисел СЕГМЕНТ: СМЕЩЕНИЕ.
Адресное пространство современных компьютеров гораздо больше 64 Кбайт и организовано оно последовательными непрерывными областями -сегментами. Для адресации в пределах, например, 1 Мбайта необходимо 20 двоичных разрядов (1 Мбайт = 220 байт), которые получаются из двух 16-разрядных слов (сегмента и смещения) следующим образом: содержимое сегмента сдвигается влево на 4 разряда, освободившиеся правые разряды заполняются нулями, результат складывается с содержимым смещения (рис. 9).
![]() |
Рис. 9. Схема формирования адреса
Фрагмент памяти размером 16 байт называется параграфом, следовательно, сегмент адресует память с точностью до параграфа, а смещение – с точностью до байта. Адреса принято записывать в 16-ричном формате.
Можно получить адрес ячейки оперативной памяти, отсчитанный от начала памяти, т.е. от адреса 0000: 0000. Такой адрес называется сплошным, его элементом хранения является число типа LongInt.
Сплошной адрес = СЕГМЕНТ * 16 + СМЕЩЕНИЕ.
Существует понятие нормализованного адреса, у которого смещение находится в диапазоне 0..15 ($0000..$000F). Сплошной адрес переводится в нормализованный формат следующим образом:
СЕГМЕНТ = Сплошной адрес div 16,
СМЕЩЕНИЕ = Сплошной адрес mod 16.
Понятие указателя
Указание связано с использованием ссылочного или указательного типа. Указатель – это особый объект, в элементе хранения которого могут содержаться адреса любых других объектов. Таким образом, константами ссылочного типа являются адреса ячеек оперативной памяти и особое значение указателя - NIL, которое не указывает ни на один из существующих в программе объектов. Мощность ссылочного типа определяется адресным пространством оперативной памяти. Размер элемента хранения ссылочного типа равен размеру элемента хранения адреса и составляет 4 байта.
Sizeof(Pointer_Type) = 4 (байта).
Объекты ссылочного типа подразделяются на типизированные (ограниченные) и нетипизированные (свободные) указатели. Свободный указатель имеет встроенный тип POINTER, может хранить адрес любого объекта (в том числе и объекта ссылочного типа), но не позволяет получить доступ к атрибутам объекта, т.к. ни с каким конкретным типом свободный указатель не связан. Ограниченный указатель всегда определяется так, чтобы указывать на объекты определенного типа.
| Type PPoint = ^ Point; | { указатели на объекты типа ТОЧКА } |
| Type PCircle = ^ Circle; | { указатели на объекты типа ОКРУЖНОСТЬ } |
Определить тип ограниченного указателя можно и до определения того типа, с которым он связан. Пример описания объектов ссылочного типа:
Var pp: PPoint; pc: PCircle;
Действия над указателями
ПРИСВАИВАНИЕ
Присваивание для указателей сводится к пересылке значения одного указателя другому. Совместимыми по присваиванию являются:
¨ два указателя одного и того же типа;
¨ константа NIL и свободный указатель;
¨ константа NIL и ограниченный указатель любого типа;
¨ свободный указатель и ограниченный указатель любого типа.
Ограниченному указателю одного типа можно присвоить значение ограниченного указателя другого типа с помощью функции приведения типов POINTER (но без крайней необходимости делать это не следует, т.к подобные действия приводят к нарушению строгой типизации).
Каждый указатель перед использованием необходимо инициализировать, т.е. установить на соответствующий объект.
Установка указателя на объект, адрес которого неизвестен, производится с помощью встроенной функции взятия адреса – Addr(), аргументом которой является идентификатор объекта. Эта функция возвращает результат типа Pointer, в котором содержится адрес аргумента. Аналогичный результат возвращает операция @.
| Type PPoint = ^ Point; Point = record X, Y: word end; PCircle = ^ Circle; Circle = record R: word; Center: Point end; | { тип - указатели на объекты типа ТОЧКА } { тип ТОЧКА } { тип - указатели на объекты типа ОКРУЖНОСТЬ } { тип ОКРУЖНОСТЬ } |
| Var op: Point; pp: PPoint; oc: Circle; pc: PCircle; | { объект ТОЧКА } { объект – указатель на объект ТОЧКА } { объект ОКРУЖНОСТЬ } { объект – указатель на объект ОКРУЖНОСТЬ } |
begin
op.X:=100; op.Y:=200;
pp:= @op;
pc:= addr (oc);
| { заполнение атрибутов объекта ТОЧКА} { установка указателя на объект ТОЧКА } { установка указателя на объект ОКРУЖНОСТЬ } |
| with oc do begin R:=5; with Center do begin X:=10; Y:=20 end; end; | { заполнение атрибутов объекта ОКРУЖНОСТЬ } |
Установка указателя на объект, адрес которого известен и хранится в другом указателе, производится с помощью присваивания.
Var
pp, pp1, pp2: PPoint; pc: PCircle; p: Pointer;
begin
pp1:= pp; p:= pc; pp2:= nil;
Результат выполнения этих операций иллюстрируется рис. 10.
![]() | |||
![]() | |||
Рис. 10. Присваивание указателей
ДОСТУП К ОБЪЕКТУ ЧЕРЕЗ УКАЗАТЕЛЬ. РАСКРЫТИЕ ССЫЛКИ.
Доступ к объекту через ограниченный указатель связан с предварительной установкой указателя на объект и последующим раскрытием ссылки. При этом имя указателя используется как идентификатор, за которым следует символ “ ^ ”, (т.е. калидент с постфиксом “^”). Доступ к объекту и его атрибутам осуществляется в несколько шагов:
¨ имя указателя – указатель используется для получения адреса того объекта, с которым он связан
¨ имя указателя^ - открывает доступ ко всему объекту, адрес которого хранится в указателе
¨ имя указателя^. - открывает доступ к атрибутам объекта
¨ имя указателя^ . имя атрибута – открывает доступ к конкретному атрибуту объекта.
Каждый из подобных квалидентов открывает доступ к уникальному объекту или атрибуту объекта.
Var p: PCircle;
| p | { доступ к объекту ОКРУЖНОСТЬ } |
| p^.R | { доступ к атрибуту РАДИУС объекта ОКРУЖНОСТЬ } |
| p^.Center.X | { доступ к атрибуту X объекта ОКРУЖНОСТЬ } |
| p^.Center.Y | { доступ к атрибуту Y объекта ОКРУЖНОСТЬ } |
В общем случае размер объекта типа указатель, не равен размеру элемента хранения объекта, доступ к которому он открывает и не равен размеру атрибута объекта, т.е.
Sizeof(указатель) # Sizeof(указатель^) # Sizeof(указатель^. атрибут).
Для того чтобы сократить длину дистанции доступа при идентификации указанием, можно использовать оператор присоединения
WITH < указатель^ > DO begin < присоединяемый фрагмент > end;
![]() |
Var oc: Circle; p: PCircle;
begin
p:=addr(oc);
with p^ do begin
Center.X:=10; Center.Y:=20; R:=5
end;
Любое присоединение, объявленное оператором WITH, выполняется после того, как определено значение присоединяющего квалидента (другими словами, адреса того объекта, к атрибутам которого будет осуществляться доступ через указатель), т.е. до “входа” в обрабатываемый фрагмент. Изменение значения присоединяющего указателя внутри присоединяемого фрагмента не изменит уже созданного присоединения. Поэтому переустановка указателя, присоединяющего к обрабатываемому объекту, внутри присоединяемого фрагмента недопустима, а может выполняться только до оператора WITH. Правильный пример использования оператора присоединения приведен выше. Ошибочный пример следует далее:
Var oc1, oc2: Circle; p: PCircle;
begin
p: = @oc1;
with p^ do begin
p: = @oc2; { ошибка: переустановка указателя внутри
присоединяемого фрагмента }
p^. R: = ……
end;
Если два типизированных указателя указывают на разные объекты одного и того же типа, то одному объекту можно присвоить значения атрибутов другого объекта. Например:
Var p, q: PCircle;
Begin
p^. R:=5; p^. Center.X:=10; p^.Center.Y:=20; { * 1 * } q^:=p^; { * 2 * }
Выполнение операторов { * 1 * } и { * 2 * } иллюстрирует рис. 11.
![]() | ||
![]() | ||
Рис. 11. Выполнение операторов { * 1 * } и { * 2 * }
Оператор { * 2 * } эквивалентен следующей группе операторов:
q^.R:=p^.R; q^.Center.X:= p^.Center.X; q^.Center.Y:=p^.Center.Y;
Заметим, что с использованием присоединения эту группу операторов можно записать следующим образом:
with q^ do begin
R:=p^.R; Center.X:=p^.Center.X; Center.Y:=p^.Center.Y
end;
или
with p^ do begin
q^.R:=R; q^.Center.X:=Center.X; q^.Center.Y:=Center.Y
end;
После выполнения присваивания значения атрибутов первого и второго объекта становятся равными, а указатели по-прежнему указывают на разные объекты.
СРАВНЕНИЕ УКАЗАТЕЛЕЙ.
Указатели можно сравнивать между собой на равенство и неравенство. Два указателя считаются равными, если они указывают на один и тот же объект или оба никуда не указывают (оба равны NIL). Неравные указатели указывают на разные объекты или один из них никуда не указывает. Указатель можно сравнивать с константой NIL, чтобы узнать, ссылается ли данный указатель на конкретный объект. Порядок вычисления булевских выражений в условных операторах, использующих доступ к атрибутам объектов через указатели, очень важен. Например оператор:
If (p <> nil) and (p^. R = 10) then …
будет работать корректно, даже если p = nil. В этом случае второе условие проверяться не будет согласно правилу вычисления булевских выражений.
Оператор
If (p^. R = 10) and (p <> nil) then …
является некорректным, т.к. если p = nil, выражение p^. R = 10 не имеет смысла, поскольку указатель p ни на какой конкретный объект не указывает.
|
|
|
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!