Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

20. Классы хранения и видимость переменных

20.1. Общие положения

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

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

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

if (n > 0) {

int i; // описание новой переменной i

...

}

Обратить внимание! Лучше не пользоваться одними и теми же именами для разных переменных, поскольку слишком велика возможность путаницы и появления ошибок.

Время жизни – это интервал времени выполнения программы, в течение которого программный объект (переменная или функция) существует. Жизнь любого объекта начинается с момента определения этого объекта. С точки зрения времени жизни различают три типа объектов: глобальные, локальные и динамические:

  1. Объект с глобальным временем жизни имеет распределенную для него память и определенное значение на протяжении всего времени выполнения программы.

  2. Объект с локальным временем жизни имеет распределенную для него память и определенное значение только во время выполнения блока, в котором этот объект определен.

  3. Объект с динамическим временем жизни имеет распределенную для него память и определенное значение с момента динамического выделения памяти под него в программе и до момента завершения программы или до момента уничтожения объекта в программе (динамическое выделение памяти будем рассматривать позднее).

Область определения (видимости) – это та часть программы, в которой может быть использован данный объект. Есть несколько типов области определения: 1) в пределах блока, 2) в пределах функции (это по сути тот же блок), 3) в пределах исходного файла, 4) во всех исходных файлах, образующих программу. Это зависит от того, на каком уровне объявлен объект: на внутреннем, т.е. внутри некоторого блока, или на внешнем, т.е. вне всех блоков.