Информатика и технология программирования

       

Классы памяти и области действия переменных


Переменные в программе обладают различными свойствами в зависимости от места и способа их определения:



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



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

Областью действия переменной могут быть:



-тело функции или блока, ограниченное скобками;



-текущий модуль от места определения или объявле ния переменной до конца модуля;



-все модули программы.

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



-переменная создается транслятором при трансляции программы и размещается в программном модуле -такая переменная существует в течение всего времени работы программы;



-переменная создается функцией в стеке в момент начала выполнения функции и уничтожается при выходе из нее;



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

Динамические переменные представляют собой особый случай. Они в принципе являются внешним по отношению к языку (и транслятору) средством. На основе комбинаций свойств переменных -области действия и времени жизни - можно определить следующие виды переменных.

l Автоматические переменные. Создаются при входе в функцию или блок и имеют областью действия тело той же функции или блока. При выходе - уничтожаются. Место хранения -стек программы. Инициализация таких переменных заменяется обычным присваиванием значений при их создании. Если функция рекурсивна, то на каждый вызов создается свой набор таких переменных. В Паскале такие переменные называются локальными (общепринятый термин). Термин "автоматические" характеризует особенность их автоматического создания при входе в функцию, то есть время жизни.



Синтаксис определения: любая переменная, определенная в начале тела функции или блока (после "{"), по умолчанию является автоматической.


Автоматическая переменная, в определении которой присутствует служебное слово register, становится РЕГИСТРОВОЙ: транслятор по возможности стремится хранить ее в регистрах процессора, что увеличивает быстродействие выполняемых над ней операций:



{ register char *p; // С памятью нужно работать ...

*p++; // эффективно



l Внешние переменные. Создаются транслятором и имеют областью действия все модули программы. Размещаются транслятором в
объектном модуле, а затем компоновщиком в программном файле (сегменте данных) и инициализируются там же. Термин "внешние" характеризует доступность этих переменных из других модулей, или область действия. В Паскале такие переменные называются глобальными (общепринятый термин).

Синтаксис определения: любая переменная, определенная вне тела функции, по умолчанию является внешней.

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

.

Файл a.c Файл b.c

.

определение переменной объявление переменной
int a,B[20]={1,5,4,7}; extern int a,B[];
... область действия ... ... область действия ...



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

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

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

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


Содержание раздела