Областью при видимости называется часть текста
программы, в которой может быть использован определенный объект. Объект является видимым в блоке
или в исходном файле, когда в данном блоке или файле
определены имя и тип объекта. Объект может быть видимым внутри блока, исходного файла или в каждом
исходном файле, образующем программу. Это определяется тем, на каком уровне объявлен объект: на вну
треннем (внутри определенного блока) или на внешнем
(вне всех блоков). Когда объект объявлен внутри блока,
он является видимым в данном блоке и в каждом внутреннем блоке. Когда объект объявлен на внешнем
уровне, он является видимым от точки его объявления
до завершения этого исходного файла. Объект можно
сделать глобально видимым с помощью определенных
объявлений во всех исходных файлах, образующих
программу. Спецификатором класса памяти в объявлении переменной может быть auto, register, static или
extern. Если класс памяти определен, он определяется
по умолчанию из контекста объявления. Объекты, принадлежащие классам auto и register, обладают локальным временем жизни. Спецификаторы static и extern
задают объекты, обладающие глобальным временем
жизни. В случае объявления переменной на внутреннем уровне можно применить любой из четырех спецификаторов класса памяти, а если его не указали, то подразумевается auto. Переменная с классом памяти
auto обладает локальным временем жизни и видна
только в блоке, в котором объявлена.
Память для данной переменной выделяется при входе в блок и высвобождается при выходе из блока. В случае повторного входа в блок этой переменной может быть выделен другой участок памяти. Переменная класса
auto автоматически не инициализируется, так как она
должна быть проинициализирована явно в случае
объявления через присвоение ей начального значения.
Значение неинициализированной переменной, класс
памяти которой auto, считается неопределенным.
Спецификатор класса памяти register заставляет
компилятор распределить память для переменной в регистре, если это возможно. Употребление регистровой
памяти чаще всего приводит к сокращению времени
доступа к переменной. Переменная, которая объявлена
с классом памяти register, обладает той же областью видимости, что и переменная auto. Количество регистров,
которые можно применить для значений переменных,
не безгранично, так как не безграничны и возможности
компьютера. В случае когда компилятор не обладает
свободными регистрами, переменной выделяется память как для класса auto. Класс памяти register может
указываться для переменных с типом int или указателей
с размером, равным размеру int.
Переменные, которые
объявлены на внутреннем уровне со спецификатором
класса памяти static, дают возможность сохранить вид
переменной при выходе из блока и применять ее при
повторном входе в блок. Данная переменная обладает
глобальным временем жизни и областью видимости
внутри блока, в котором она объявлена. Для переменных с классом static память выделяется в сегменте данных. В отличие от них переменные класса auto имеют память, которая выделяется в стеке. Исходя из этого,
значение переменных с классом static сохраняется при
выходе из блока.