Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Часть_1.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
975 Кб
Скачать
☆

13.1. Адресация памяти

Адресное пространство памяти представляет собой последовательность байтов. Исторически сложилось так, что первые машины имели адресную шину из 16 линий (16-разрядную), которая позволяла адресоваться к объему памяти до 216=64 Кб. Позже адресная шина ПК стала состоять из 20 линий. 20 бит позволяли адресоваться к 220=1 Мб, но сами машины продолжали оставаться 16-разрядными. На этом этапе память была разбита на сегменты по 64 Кб (сегментирована). И когда в программе адресовались к памяти, то указывали номер сегмента (его адрес) и смещение внутри сегмента от его начала.

На выходе из системной шины появилось устройство формирования адреса, а в процессоре появился сегментный регистр.

Сегмент – участок памяти длиной 64 Кб, который может начинаться только с адреса, кратного 16 (т. е. 0, 16, 32, 48 и т. д.). Фрагмент памяти в 16 байт называется параграфом (говорят, что сегмент всегда выровнен на начало параграфа). Смещение – указывает, сколько байт от начала сегмента нужно отступить, чтобы обратиться к нужному адресу.

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

С появлением 32-разрядных машин сегментирования памяти не стало, но форма записи сохранилась.

Во всех современных языках программирования, в том числе и в Паскале, есть специальный тип данных, который позволяет получить значение адреса (как полного, так и его частей).

13.2. Указатели

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

Указатель – переменная, значением которой является адрес (первого байта памяти), по которому записаны данные.

Указатель занимает в памяти 4 байта. При этом данные, на которые он указывает, могут простираться на десятки килобайт.

К переменной, на которую указывает указатель, можно обращаться через имя этого указателя (т. е. можно «ссылаться» на нее посредством указателя), отсюда и название – ссылочная переменная.

13.2.1. Операции с указателями

Тип – это всегда два множества: множество значений и множество операций. Значениями переменных типа указатель являются адреса памяти. К указателям применимы операции отношения, их можно сравнивать (равны или неравны, но не меньше или больше). Указатели равны только в случае, если они ссылаются на один и тот же объект, т. е. содержат один и тот же адрес.

Существует операция, которая возвращает указатель – адрес первого байта памяти, по которому записана переменная (любого типа), – это

@<Имя переменной> или функция

Addr (<имя переменной>)

Например, @x или addr(x).

Различают типизированные и нетипизированные указатели.

13.2.2. Нетипизированные указатели

Таким указателям можно присваивать адрес любой переменной независимо от типа. Нетипизированный указатель обозначается pointer. Используется для данных, структура и тип которых меняются в ходе выполнения программы.

П р и м е р

Пусть var p, r : pointer; x,y: integer; st: string;

а) p:= @x; r:= @st; p <> r - true;

б) x:= y; p:= @x; r := @y; p <> k - true;

в) p:= @x; r:= @x; p = r - true.

П р и м е р «указатель на указатель»

type int:ip;

var

a:ip; a1:^ip;