Одна из сильных сторон языка С заключается в возможности управления мелкими деталями программы. Примером подобного управления служат классы памяти – они дают возможность определить, с какими функциями связаны какие переменные и как долго переменная сохраняется в программе.
Каждая из переменных программы имеет определенный тип. Кроме того, каждая переменная имеет определенный класс памяти. Для описания классов памяти существует 4 ключевых слова: extern (внешний) - глобальный, auto (автоматический) - локальный, static (статический) и register (регистровый).
В отличие от локальных, глобальные переменные определяются вне тела какой-либо функции и «видны» сразу нескольким функциям. Исходный текст программы можно хранить в нескольких файлах. Эти части каждый раз транслировать вместе нет никакой необходимости. Ранее скомпилированные программы можно загружать из библиотек.
Рассмотрим пример.
#include <stdio.h>
#include <conio.h>
int conclusion();
char Answer; // Глобальная переменная
//-----------------------------------------------
void main()
{
printf ("\nWhether you can swim?? ('Y/N')");
do {
Answer = getche();
} while(!conclusion());
}
//-----------------------------------------------
int conclusion()
{
int retcode;
switch(Answer)
{
case 'Y':
case 'y': retcode = 1;
printf ("\nOk!\n");
break;
case 'N':
case 'n': retcode = 1;
printf ("\nBad!\n");
break;
default: retcode = 0;
printf ("\nThe answer is not identified! Repeat, please!\n");
}
return retcode;
}
В этом случае переменная Answer является внешней переменной и может быть использована в любой из функций.
Объявленные внутри функции переменные считаются принадлежащими к классу auto, если не указано иначе.
Формальные аргументы для функций принадлежат к классу auto, но можно задать для них класс register.
Класс памяти переменной определяется местом ее описания и ключевым словом, если оно используется. Класс памяти определяет три условия:
1. От него зависит, какие функции имеют доступ к переменной. Если фрагмент кода может использовать определенную переменную, говорят, что переменная видима в данном разделе. Доступность переменной различным частям программы задает ее область видимости.
2. В каком количестве мест одна и та же переменная может объявляться. Это свойство называется связыванием переменной.
3. Длительность существования переменной в памяти – продолжительность хранения.
Переменная может иметь одну из трех областей видимости (действия):
1. В пределах файла (модуля) - доступна от точки определения до конца файла, содержащего определение. Например, переменная Answer из предыдущего примера.
2. В пределах блока - доступна от точки определения, до конца блока, содержащего определение. Использовавшиеся до сих пор локальные переменные, включая формальные аргументы функций, имеют область видимости в пределах блока.
3. В пределах прототипа функции - применима к именам переменных, используемым в прототипах функций, например
double Oper (double Argument);
Переменная может связываться:
1. внешним образом (может использоваться в любом месте программы, включающей несколько модулей (файлов);
2. внутренним образом (может использоваться в любом месте единственного файла);
3. не связываться (используется только в блоке, где она описана).
Переменная может иметь продолжительность хранения:
1. статическую (существует на протяжении выполнения программы)
2. автоматическую (гарантированно существует лишь во время выполнения того блока, в котором она описана). Она создается в момент начала выполнения блока и ликвидируется по завершению его работы.
Внешние переменные (подобно Answer) имеют статическую продолжительность хранения.