Классы памяти и области видимости переменных
Классы памяти
Класс памяти определяет «время жизни» объекта. Под объектом понимается идентификатор переменной, функция либо указатель функции. Кроме этого, класс памяти в совокупности с местоположением переменной в программе, определяет область видимости переменной.
Различают два вида объектов: глобальные и локальные.
Объекты с глобальным временем жизни существуют и имеют значение на протяжении всего времени исполнения программы.
Все функции и их указатели – глобальные объекты. Локальные объекты «захватывают» новую область памяти всякий раз, когда управление передается блоку, в котором они описаны.
Если переменная описана вне всяких блоков, то она считается глобальной. Это описание на так называемом внешнем уровне.
Блок- это описание функции, составная команда, либо часть программы, заключенная в фигурные скобки
{
это блок
}
Блоки могут быть вложенными:
{
{
это вложенный блок
}
}
Переменные, описанные внутри некоторого блока, являются локальными. При каждом входе в блок им выделяется новая область памяти, а при выходе из блока память освобождается и значение переменной, следовательно, теряется. Локальные объекты видны с момента их описания до конца блока.
Если при выходе из блока нужно сохранить значение переменной, то ее следует описать как статическую в данном блоке, например:
{
static int a;
...
}
Теперь при выходе из блока переменная а будет сохранять в памяти свое место и значение и будет «видна» только в этом блоке, а также в блоках вложенных в него.
Глобальные объекты видны с момента их описания до конца файла всем функциям (блокам).
Если имя локального объекта (переменной) совпадает с именем глобального объекта, то локальный объект маскирует глобальный в этом блоке.
Область действия меток - функция, в которой метка используется.
Пример 9.1: Область видимости переменных.
#include <stdio. h>
int k = 1; /* k = 1 */
void main(void)
{
printf(“k = %d \n”, k); // Результат: k = 1
{
//1-й вложенный блок
int k = 2, m = 5;
printf(“ k = %d \t m = %d \n”, k, m); // Результат: k =2, m = 5
{
//2-й вложенный блок
int k=0;
printf(“ k = %d \t m = %d \n”, k, m); // Результат: k=0, m=5
}
printf(“ k = %d \n”, k); // Результат: k=2
}
printf(“ k = %d \n”, k); // Результат:k=1
}
В приведенной программе четыре уровня видимости:
1) внешний уровень;
2) тело функции main();
3) 1-й вложенный блок;
4) 2-й вложенный блок
Внешний уровень – уровень файла. Объект внешнего уровня виден “всем в файле”. Время его жизни – глобальное. На локальном уровне внешний объект может быть переопределен.
Дата добавления: 2017-06-02; просмотров: 287;