Разновидности указателей в С ++. Замечания о работе менеджера кучи в С++. Ссылки, структуры и объединения

Страницы работы

Содержание работы

Разновидности указателей в С ++

Внутреннее представление указателей связано с сегментной организацией памяти. В С ++ существуют модификаторы, позволяющие выбирать внутренние представление указателей.

Указатели подразделяются на четыре вида:

·  ближние    near

·  дальние far

·  сверхдальние (нормализованные)huge

·  сегментные        seg

При определении указателя модификатор размещается непосредственно перед * и относится только к одному указателю.

Ближний указатель

тип near * указатель [инициализатор]

Имеют внутреннее представление 2 байта и позволяют адресовать объекты в пределах сегмента.

Дальний указатель

тип far * имя_указателя [инициализатор];

Занимает 4 байта и содержит сегментную часть и смещение. Для формирования значения дальнего указателя в модуле dos имеется макрос MK_FP.

void far * MK_FP (unsigned segment, unsigned offset)

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

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

            При сравнении дальних указателей на >, >=, <, <= , сравниваются только значения смещений. При использовании операций +, -, автоинкремент, автодекремент – при выходе за границы сегмента указатель циклически возвращается к “противоположной” границе того сегмента, на который указывает сегментная часть адреса.

            Если необходимо выполнить адресацию за пределами сегмента, следует явно изменить номер сегмента.

Сверхдальние указатели ( нормализованные)

тип huge * имя_указателя [инициализатор]

Имеют длину внутреннего представления 32 бита и содержат нормализованные адреса, которые отсчитываются от 0.

            Нормализованный адрес содержит смещение в диапазоне от 0 до F, поэтому, например,  полный адрес 0x000:0x417 будет нормализован 0х0041:0х0007.

Значение указателя представляется как беззнаковое целое типа unsigned. Операции сравнения длоя сверхдальних указателей всегда выполняются корректно. Т.к. при использовании сверхдальних указателей автоматически производится нормализация, выполнение программы замедляется.

Сегментный указатель

Сегментные указатели занимают 16 бит и определяются

тип _seg * имя_указателя

В качестве модификатора _seg используются служебные слова _сs, _ds, _es, _ss, позволяющие определить четыре вида указателей, каждый из которых соответствует сегментному регистру. Например,

int _ss *pss;

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

после выполнения

Замечания о работе менеджера кучи в С++

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

            Поэтому минимально резервируемая область в куче в С++ содержит 20 байтов – 4 байта заголовка плюс 16-байтовый параграф. Собственно данные располагаются со смещением 4 байта от начала сегмента.

Функции

     Определение функции, в котором выделяются две части – заголовок и тело, имеет формат

тип_возвращаемого_знач имя_функции(спецификация_формальных_параметров)

{ //тело функции }

     Спецификация формальных параметров – либо void, либо пусто, либо список спецификаций отдельных параметров, в конце которого может быть многоточие.

Спецификация формального параметра имеет вид:

тип имя_параметра [= значение_по_умолчанию ];

Если функция не  возвращает значения, то указывается void.

Тело функции – это блок, т.е. последовательность описаний и операторов, заключенная в фигурные скобки. В теле вызова должен содержаться оператор возврата в точку вызова

return [выражение];

Оператор возврата может отсутствовать, если тип возвращаемого значения void.

Строгое согласование по типам между формальными и фактическими параметрами требует, чтобы в модуле до первого обращения к функции было помещено либо ее определение, либо ее описание (прототип).

тип_возвращаемого_знач имя_функции(спецификация_формальных_параметров);

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

Обращение к функции трактуется как бинарная операция (), операндами которой являются имя функции и список фактических параметров.

Если функция размещается в разных модулях, то для их присоединения используется директива

#include < имя библиотечного файла>

#include "имя пользовательского файла"

Функции с переменным числом параметров

Функции с переменным количеством параметров – это функции, у которых тип и количество параметров в момент компиляции могут быть не определены. Они становятся известными только в точках вызова функции, когда явно задается список фактических параметров. Прототип функции с переменным количеством параметров:

тип имя_функции (спецификация_явных_параметров,…);

Чтобы определить, где заканчивается  список необязательных параметров, можно:

Похожие материалы

Информация о работе

Тип:
Конспекты лекций
Размер файла:
136 Kb
Скачали:
0