Класс памяти определяет область действия переменной и продолжительность ее существования в оперативной памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Есть четыре ключевых слова, используемых для описания класса памяти:
- auto – автоматический класс (временное существование, область действия – локальная);
- extern – внешний класс (постоянное существование, область действия –глобальная);
- static - статический класс (постоянное существование, область действия – локальная);
- register – регистровый класс (временное существование, область действия – локальная, размещение – в регистрах центрального процессора, к которым доступ выполняется гораздо быстрее, чем в оперативной памяти).
1. как переменные, описанные внутри функции, по умолчанию являются автоматическими. Можно, однако, это подчеркнуть явно с помощью ключевого слова auto:
main ( )
{ auto int x;
…
Автоматические переменные имеют локальную область действия. Только функция, в которой переменная определена, «знает ее». Другие функции могут использовать переменные с тем же самым именем, но это будут уже другие области памяти. Автоматическая переменная начинает существовать при вызове функции, содержащей ее. Когда функция завершает свою работу и возвращает управление туда, откуда ее вызвали, автоматическая переменная исчезает. Ячейка памяти может использоваться для чего–нибудь другого.
2. Переменная, описанная вне функции, является внешней. Внешнюю переменную можно описать в функции при помощи ключевого слова extern. Если в какой – либо функции используется какая – либо переменная, не объявленная в ней, то она считается внешней переменной с атрибутами, объявленными вне этой функции. Но, если переменная используется, но нигде вне функции не описана, то это – ошибка! Правда, такая ошибка будет выловлена при трансляции. Гораздо хуже будет, если в какой – либо функции мы забудем указать атрибут extern, хотя сама переменная будет описана в ней.
3. Статические переменные объявляется служебным словом static. Они имеют такую же область, что и автоматические переменные, но они не исчезают, когда содержащая их функция закончит свою работу. Программа хранит их значения от одного вызова функции к другому. Этот факт можно проверить на следующем примере:
#include <stdio.h>
#include <conio.h>
void F();
void main ()
{ int i;
clrscr();
for(i =1; i < 4; i++ )
{
printf("итерация %d : ”, i );
F( ):
}
getch();
}
void F()
{ int y = 1; //объявление и инициализация автоматической переменной
static int x =1;// объявление и инициализация статической переменной
printf (“x = %d y = %d \n”, x++ , y++ );
}
переменная y не меняет своего значения, т. к. оператором int y = 1; для нее каждый раз выделяется новая ячейка и в нее посылается единица. В дальнейшем в операторе печати оператором y++ значение y увеличивается на 1, но по окончании выполнения функции это значение исчезает вместе с ячейкой. Другое дело статическая переменная x. Для нее ячейка выделяется в специальной статической области памяти и эта ячейка существует, пока выполняется программа. Кроме того, инициализация для нее выполняется только один раз при первом входе в функцию F. Эти особенности статической переменной и объясняют полученный нами результат работы программы.
Рассмотрим еще один вид статической переменной – внешней статической переменной, которая объявляется вне любой функции:
static x;// внешняя статическая переменная
float y()
{
….
}
Разница между внешней переменной и внешней статической переменной заключается в области их действия. Обычная внешняя переменная может использоваться функциями в любом файле, в то время как внешняя статическая переменная может использоваться только функциями того же самого файла.
4.Регистровые переменные запоминаются в регистрах центрального процессора. Доступ к ним и работа с ними выполняется гораздо быстрее, чем в оперативной памяти. В остальном, регистровые переменные аналогичны автоматическим переменным. Объявляются они служебным словом register:
register int x;
Следует иметь в виду, что описание переменной как регистровой является скорее просьбой, чем обязательно выполнимой командой. Компилятор сравнивает наше требование с количеством свободных регистров. Если есть возможность удовлетворить требование, то переменная размещается в регистре, в противном случае переменная становится простой автоматической переменной.