Разыменование никуда не установленного указателя или указателя

со значением nil приводит к аварийному завершению программы.

 

В большинстве компьютеров адреса занимают 4 байта и количество адресов памяти в связи с этим будет равно 232.

Для хранения адреса требуются два слова (4 байта), одно из них определяет сегмент, второе - смещение.

 

Основным применением указателей является работа со свобод­ной памятью. Память процесса выполнения программы делится на несколько частей:

память для операторов программы;

статическая память - для глобальных и статических перемен­ных программы и модулей;

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

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

динамических переменных называется управлением кучи.

 

 

Указатель может быть как автоматической или статической переменной , так и динамической.

Операция @.C помощью операции @ можно создать указатель на переменную (определить адрес). В табл показаны операнд и типы результата.

Таблица 6.9 Операция создания указателя

Операции действие Тип операнда Тип результата
@ Получение указателя Ссылка на переменную, процедуру или идентификатор функции Указатель

 

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

 

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

 

Примечание:

При использовании операции @ с процедурными переменными

используются специальные правила.

 

Использование операции @ для переменной. Использование операции @ для обычной переменной (не параметра) не вызывает никаких сложностей.

 

Пример Введем описания:

Type

TChar = array[0..1] of char;

Var

int: integer;

TCharPtr: ^TChar;

тогда оператор:

TCharPtr := @Int;

приводит к тому, что TCharPtr для получения ссылки на TCharr^ становится повторной интерпретацией значения Int, как если бы оно было символьным массивом array[0..1].

 

Использование операции @ для параметра-значения. Использование операции @ для формального параметра-значения приводит к тому, что будет построен указатель, указывающий на ячейку стека, в которой содержится фактическое значение параметра. Предположим, что F является формальным параметром-значением процедуры, а FРtr^ является указателем-переменной. Если в процедуре выполняется операция:

FPtr := @F;

то FРtr^ будет ссылкой на значение F. Однако, FРtr^ не указывает на сам параметр F, поскольку он указывает на значение F, которое было взято из F и сохранено в стеке.

Использование операции @ для параметра-переменной. Применение операции @ к параметру-переменной приведет к тому, что будет сформирован указатель на фактический параметр (указатель берется из

 

стека). Предположим, что Оn - параметр-переменная процедуры, Tw - переменная, передаваемая в процедуру в качестве фактического параметра- переменной Оnе, а ОnеPtr является указателем на переменную. Если в процедуре выполняется оператор:

OnePtr := @One;

то ОnеРtr является указателем на переменную Twо, а ОnеPtr^ - ссылка на саму переменную Twо.

 

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

Если в соответствующем описании функции содержится список формальных параметров то в вызове функции должен содержаться список фактических параметров. Каждый параметр подставляется вместо соответствующего формального параметра. Синтаксис вызова функции теперь расширен и допускает вместо идентификатора функции уточненный идентификатор метода.

Приоритет операций.Приоритет определяет очередность выполнения операций. Значения приоритетов указаны в табл.

 

Операция Приоритет Вид операции
@, NOT *,/,DIV,MOD,AND +,-,OR,XOR =,<>,<,><=,>=,IN Первый (высший) Второй Третий Четвертый(низший) Унарная операция Операции типа умножения Операции типа сложения Операции отношения  

 

Приоритет операций определяется следующими правилами:

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

2. Операция, находящаяся между двумя операциями с разными приоритетами, связывается с той операцией, которая находится слева.

3. Выражение в скобках вычисляется как отдельный операнд.

4. Операции с равным приоритетом выполняются слева направо.

 








Дата добавления: 2015-01-13; просмотров: 886;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.