Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Указатели и динамические переменные




Вопросы для проверки знаний.

1. Какова минимальной адресуемой единицы памяти в современных языках программирования, а также вычислительных системах?

2. Сколько ячеек памяти можно адресовать при помощи 8-битных адресов?

3. Что называют стандартной памятью ПК?

4. В чем заключается принцип сегментированной адресации?

5. Что называют сегментами и смещением адреса?

6. С какими сегментами одновременно может работать программа в МП 8086 и какие сегментных регистра используются для адресации в них?

7. Какие исходные данные задают полный адрес в МП 8086 и как он вычисляется?

8. Что такое динамическая память?

9. Каким образом происходит обращение к динамическим данным?

3.6.1. Виды указателей и их описание

Указатели делятся на стандартные и определяемые программистом. Величины стандартного типа pointer предназначены для хранения адресов данных произвольного типа и при описании не привязаны к каким-либо конкретным типам.

Пример 1 указателя стандартного типа:

var p: pointer;

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

Также можно задать указатель на данные или подпрограмму конкретного типа. Как и для всех других нестандартных типов, это делается в разделе type с применением обозначения указателя ^.

Пример 2 описания переменной Buffer типа строка, включающая 255 символов, и указателя BufPtr на данную переменную, а также других переменных данных типов:

type
Buffer = String[255];
BufPtr = ^Buffer;
Var B: Buffer;
BP: BufPtr;

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

Пример 3. Задание указателя на данные типа word при описании переменной:

var pw: ^word;

Замечание. В Free Pascal, как и в других языках (например С) задание указателя на данные некоторого типа может рассматриваться как описание массива этого же типа (структурированной величины, состоящей из величин одного типа), причем сам указатель указывает на нулевой элемент этого массива.

Пример 4. Задание указателя на данные типа word в примере 3 можно считать эквивалентным следующему объявлению массива бесконечной длины с именем pw, у которогонумерация элементов начинается с 0, тип элементов - word (сам указатель задает адрес нулевого элемента):

var pw: array[0..Infinity] of word;

Таким образом, при описании типизированного указателя компилятор одновременно:

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

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

Если указатель не типизирован, то по умолчанию считается, что он ссылается на данные, которые занимают в памяти по одному байту.

3.6.2. Действия с указателями

Для того, чтобы занести в указатель адрес существующей переменной (которая уже описана и получила свое место в памяти), применяют операцию получения адреса переменной. Она обозначается виде префикса @ или функции addr().

Пример 4 получения в указатель pw адреса переменной w типа word:

var w: word; { описание переменной w типа word }

pw: ^word; { описание указателя pw на величины типа word }

...

pw:= @w; { или pw:= addr(w); - засылка адреса переменной w в указатель pw }

Для обращения к значению переменной, адрес которой хранится в указателе, примеряется операция разадресации (разыменования), обозначаемая с помощью суффикса ^:

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

Пример 5 разыменования указателя pw из примера 4 и выполнения операций с получаемой переменной типа word:

pw^:= 2;

inc(pw^);

writeln(pw^);

Правила присваивания указателей:

1) любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти,

2) указатели стандартного типа pointer совместимы с указателями любого типа,

3) указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.

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

addr(x): pointer — возвращает адрес х (аналогично операции @), где х — имя переменной или подпрограммы;

seg (x): word — возвращает адрес сегмента для х;

ofs (x): word — возвращает смещение для х;

cseg: word — возвращает значение регистра сегмента кода CS;

dseg: word — возвращает значение регистра сегмента данных DS;

ptr (seg, ofs: word): pointer — по заданному сегменту и смещению формирует адрес типа pointer.

Замечание. В Free Pascal, как и в С (но в отличие от Турбо Паскаля), поддерживаются арифметические действия с указателями сложение и вычитание. При этом каждая единица изменения величины типизированного указателя (например, при помощи функций Inc и Dec) означает сдвиг в памяти на такое число байт, которое занимает одна величина данного типа.

Пример 6 программы с описаниями и операциями с указателями:

var p1,p2: ^longint; { описание указателей p1,p2 на величины типа longint }

L: longint; { описание величины L типа longint }




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 706; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.