Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
356
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

5.7. Классы памяти и организация программ Локализация объектов.

Локализация объектов. До сих пор в примерах программ мы использовали в основном только два класса памяти — автоматическую и динамическую память. (В последнем примере из §5.6 использована глобальная переменная int counter, которая является внешней по отношению к функциям программ main( ), giper( ).) Для обозначения автоматической памяти могут применяться спецификаторы классов памяти auto или register. Однако и без этих ключевых слов-спецификаторов класса памяти любой объект (например, массив или переменная), определенный внутри блока (например, внутри тела функции), воспринимается как объект автоматической памяти. Объекты автоматической памяти существуют только внутри того блока, где они определены. При выходе из блока память, выделенная объектам типа auto или register, освобождается, т.е. объекты исчезают. При повторном входе в блок для тех же объектов выделяются новые участки памяти, содержимое которых никак не зависит от "предыстории". Говорят, что объекты автоматической памяти локализованы внутри того блока, где они определены, а время их существования (время "жизни") определяется присутствием управления внутри этого блока. Другими словами, автоматическая память всегда внутренняя, т.е. к ней можно обратиться только в том блоке, где она определена.

Пример:

Результат выполнения программы:

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

Результат выполнения программы:

Отличие функций autofunc( ) и stat( ) состоит в наличии спецификатора static при определении переменной int K, локализованной в теле функции stat( ). Переменная К в функции autofunc( ) - это переменная автоматической памяти, она определяется и инициализируется при каждом входе в функцию. Переменная static int К получает память и инициализируется только один раз. При выходе из функции stat( ) последнее значение внутренней статической переменной К сохраняется до последующего вызова этой же функции. Сказанное иллюстрирует результат выполнения программы.

Глобальные объекты.

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

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

Результат выполнения программы:

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

Глобальный объект может быть "затенен" или "скрыт" внутри блока определением, в котором для других целей использовано имя глобального объекта. Модифицируем предыдущую программу:

Результат выполнения программы:

Переменная int N автоматической памяти из функции main( ) никак не влияет на значение глобальной переменной int N. Это разные объекты, которым выделены разные участки памяти. Внешняя переменная N "не видна" из функции main( ), и это результат определения int N внутри нее.