Разыменование никуда не установленного указателя или указателя
со значением 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; просмотров: 949;