Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-7,13-15,20-32.docx
Скачиваний:
5
Добавлен:
26.09.2019
Размер:
48.11 Кб
Скачать

13. Указатели

Для уяснения понятия указателя необходимо рассмотреть структуру и использование оперативной памяти компьютера в операционной системе MS DOS (основные принципы распределения памяти справедливы и для Windows):

 

 

Области самых младших и самых старших адресов занимают системные ресурсы, обеспечивающие функционирование операционной системы. Сразу за системной областью младших адресов располагается исполняемый код прикладной программы. Сегмент данных содержит ячейки для хранения значений глобальных констант и переменных. Стек представляет собой буфер для временного хранения промежуточных (локальных) переменных и констант. Перечисленные фрагменты ОЗУ составляют так называемую статическую память, которая заполняется сразу при запуске программы и не освобождается до ее завершения. Следующий участок ОЗУ (по ходу возрастания адресов) представляет собой динамическую память, или кучу. Ячейки кучи могут неоднократно выделяться и освобождаться по мере необходимости во время выполнения программы, т.е. динамически. В Паскале все константы и переменные, объявленные в разделе const и var основной программы или модуля, располагаются в сегменте данных, т.е. статической памяти. Размер сегмента данных и стека составляет соответственно 64 К и 16 К, что сильно ограничивает разработку программ, оперирующих большими массивами переменных емкого типа. Кардинальным решением этой проблемы является использование указателей и соответствующих средств доступа к динамической памяти. Указатель, или ссылка – это переменная, значением которой является физический адрес некоторой ячейки памяти (чаще всего динамической). Адрес каждой ячейки памяти ПК занимает 4 байта, или два машинных слова. Первое слово задает смещение адреса относительно начала сегмента, а второе – абсолютный адрес сегмента. Сегмент – это участок памяти, имеющий длину 64К и начинающийся с физического адреса, кратного 16 (0, 16, 32, 48 и т.д.). Смещение показывает, сколько байтов от начала сегмента нужно пропустить, чтобы достичь нужного адреса. Обычно слова адреса записываются в шестнадцатиричной системе через двоеточие, например: F3A1 : 128D смещение    сегмент

Фрагмент памяти в 16 байтов называется параграфом, поэтому сегмент адресует память с точностью до параграфа, а смещение – с точностью до байта. Поскольку большинство типов данных занимают несколько смежных байтов, то указатель содержит адрес первого байта ячейки памяти, при этом сам указатель занимает 4 байта (два слова).

Указатели в Паскале бывают двух типов:

-   типизированный указатель (ссылка), который адресует ячейку для данных определенного типа;

-   нетипизированный указатель (стандартный тип Pointer), который ссылается на начало области памяти для данных неопределенного, или произвольного типа. Другими словами, нетипизированный указатель содержит просто адрес некоторой ячейки памяти.

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

Пусть имеем описание:

var p1:  ^Char; p2:  ^Boolean; pp:  Pointer;   {нетипизированный указатель} Присваивание значения одного указателя другому возможно только между указателями объектов идентичного типа. Например, нельзя записать: p1:= p2; {ошибка!}

Нетипизированный указатель совместим по присваиванию с указателем любого типа. Поэтому можно сделать присваивание между p1 и p2 опосредованно:

pp := p2; p1 := pp;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]