Занятие 7 Время жизни и область видимости переменной. Функции.
1. Время жизни и область видимости переменной
1.1 Общие понятия
При определении переменной компилятор выделяет для нее память, причем тип данных определяет размер выделенной области.
После того, как переменная создана, в ней можно размещать данные, но всегда ли к этим данным можно обратиться, или, как говорят, всегда ли эти данные доступны? Чтобы ответить на этот вопрос, необходимо рассмотреть несколько новых понятий.
Программным блоком будем называть часть программы, заключенную в {}. Программируя на С, мы всегда имеем дело с программными блоками, например, тело функции main(), тело цикла, одна из альтернатив оператора if – все это программные блоки.
Различают два вида блоков:
1) составной оператор,
2) определение функции.
Блоки могут быть вложенные, внутренний блок называется вложенным, а внешний блок – объемлющим. При использовании вложенных блоков следует соблюдать следующие правила:
Блоки могут включать в себя составные операторы,
Блоки не могут включать в себя определения функций.
Программный модуль – это файл с исходным текстом программы.
Время жизни программного объекта (объектом может быть переменная, функция и т.п.) – это интервал времени выполнения программы, в течение которого программный объект существует. Время жизни переменной может быть локальным или глобальным.
Переменная с глобальным временем жизни существует, т.е. имеет распределенную для нее память и определенное значение, на протяжении всего времени выполнения программы.
Переменная с локальным времени жизни существует только во время выполнения блока, в котором эта переменная определена. При каждом входе в блок для локальной переменной распределяется новая память (переменная создается), которая освобождается при выходе из блока (переменная уничтожается).
Область видимости объекта – это та часть текста программы, в которой может быть использован данный объект. Объект считается видимым в блоке или модуле, если в этом блоке или модуле известны имя и тип объекта, в этом случае говорят, что объект доступен и к нему можно обращаться.
Объект может быть видимым в пределах:
Блока,
Модуля (файла),
Во всех модулях (если программа располагается в нескольких файлах).
Область видимости переменной зависит от того, в каком месте программы (на каком уровне) она объявлена. Если переменная объявляется вне всех блоков программы (обычно в начале программы, до функции main()), то это внешнее объявление или глобальная переменная.
Внутри блока или функции объявляются локальные переменные, они видимы в том блоке, в котором объявлены, и во всех вложенных, если таковые есть.
В следующем примере переменная q существует на протяжении всего времени выполнения программы, она видима во всех блоках программы.
Переменная i существует на протяжении выполнения функции main(), она видима внутри функции main(), т.е. в текущем модуле программы.
Переменные k и l существуют на протяжении выполнения вложенного блока, они создаются при входе во вложенный блок и уничтожаются при выходе из него. Переменная i видна как в своем блоке (в функции main()), так и во вложенном блоке, переменные k и l не видны вне "своего" блока (там их просто не существует).
Пример 1.
…
int q; // глобальная переменная
void main()
{ // функция main(), объемлющий блок
int i; //локальная переменная функции main()
…
{ // вложенный блок
int k, l; //локальные переменные вложенного блока
…
}
…
k++; //ошибка, переменной k здесь не существует
}