Если число элементов данных заранее не известно, то при использовании статических переменных необходимо выделять память по максимуму. В экономических и информационных задачах число элементов данных может колебаться от нескольких десятков до нескольких тысяч и более, причем в разных случаях соотношение между численностью различных данных различно. В результате оперативной памяти для размещения программы может не хватить. Если же сэкономить на некоторых данных, то при превышении размера программа закончится аварийно, что недопустимо.
Выходом из положения служит использование динамических переменных. Динамической переменной называется переменная, память для которой выделяется в процессе работы программы по специальному запросу. Занимается распределением динамической памяти операционная система. При запросе на размещение динамической переменной операционная система выделяет ей память из числа свободных ячеек и помечает их как занятые. После того, как данная переменная больше не нужна программе, ее можно освободить и снова сделать выделенные ей блоки свободными. Та же память может быть выделена другой переменной той же или даже другой программы (описанная функция операционной системы называется управлением памятью и является одной из важнейших).
В Паскале выделение динамической памяти осуществляется функцией new, а освобождение – функцией dispose. Однако сдесь возникают некоторые концептуальные трудности. Уже говорилось, что транслятор заменяет каждое имя объекта адресом данного объекта (на самом деле смещением от начала соответствующей секции). Но ведь адрес динамической переменной появляется только в момент ее размещения и при компиляции неизвестен. Следовательно, программный код должен быть устроен таким образом, чтобы можно было совершать операции над непоименованными переменными, адрес которых в момент компиляции программы не известен.
Указанное противоречие разрешается использованием в языках программирования специальных переменных – указателей или ссылок. Значением указателя является адрес того участка памяти, где в настоящий момент храниться значение динамической переменной. Следовательно, для указателя существенны две области памяти: одна, где указатель хранится, и другая, на которую указатель указывает. Отметим, что сам указатель является статической переменной и память для него выделяется заранее (это два или четыре байта). Очевидно, что использовать динамическую память имеет смысл тогда, когда сама динамическая переменная требует гораздо большего объема памяти (обычно это массив или запись).
4.13.1. Указатели.
Перейдем теперь к механизму использования указателей в языке Турбо Паскаль. Различают нетипизированные и типизированные указатели. Нетипизированный указатель объявляется при помощи предопределенного типа pointer. Значение нетипизированного указателя представляет собой адрес в оперативной памяти. Значение типизированного указателя также представляет собой адрес, но по этому адресу обязано быть размещено данное только определенного типа. Для оперирования с типизированным указателем используется символ “^” (крышка). В разделе объявлений переменных типизированный указатель описывается следующим образом:
: ^
Например, указатель типа ^integer ссылается на переменную целого типа, а указатель типа ^rec ссылается на запись типа rec, определенную программистом в разделе типов.
Для того, чтобы значение по адресу, хранящемуся в указателе, использовать в выражении, нужно записать крышку после имени указателя: если переменная n имеет значение 1, а переменная p указывает на n, то выражение p^ равно 1. Используя указатель, можно также присвоить значение по адресу, указанному в указателе: в вышеприведенном примере оператор p^:=5 законен и после него переменная n примет значение 5. Общее правило можно сформулировать следующим образом: если в текущий момент указатель ссылается на некоторую переменную, то использование имени указателя с крышкой после него тождественно использованию имени переменной. Преимущество в использовании указателей заключается в том, что меняя содержимое указателя, одно и то же действие можно сделать с различными переменными и даже с непоименованными значениями.
8th Май 2011
|
Теги:
|