Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ПВМ.doc
Скачиваний:
5094
Добавлен:
21.02.2016
Размер:
2.79 Mб
Скачать

Тема 6. Классы памяти и разработка программ.

Класс памяти определяет область действия переменной и продолжительность ее существования в памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Ранее при рассмотрении функций было отмечено, что переменные, описанные в функции как локальные переменные, доступны только внутри функции. Для того, чтобы использовать переменную в нескольких функциях, необходимо описать ее как внешнюю переменную. Переменные, определенные вне функции, являются внешними и имеют глобальную область действия. Каждая переменная имеет тип, а также она принадлежит к некоторому классу памяти. Для описания классов памяти используется четыре ключевых слова: для описания внешнего класса используется ключевое слово extern, для автоматического класса – словоauto, для описания статического класса – словоstatiс и для описания регистрового класса –register. Рассмотрим свойства переменных, относящихся к определенному классу памяти.

Автоматические переменные. Переменные, описанные внутри функции, считаются относящимися к классуauto, если нет другого явного описания класса памяти, то есть по умолчанию переменные, описанные в функции, являются автоматическими. Иногда переменные описывают явно с использованием словаauto, для того чтобы показать, что переменная описана только внутри этой функции. Ключевое словоautoуказывается перед спецификацией типа переменной в описании переменной. Автоматические переменные имеют локальную область действия и начинают существовать при вызове функции, содержащей ее. При завершении работы функции автоматические переменные исчезают, а ячейки памяти, выделенные для автоматических переменных, могут снова использоваться для других переменных. (Переменные, описанные в начале функции доступны в пределах функции)

Внешние переменные. Переменная, описанная вне функции, является внешней. Внешнюю переменную можно описать в функции, которая использует ее, при помощи ключевого словаextern.

int l;

main()

{ extern int l;

scanf(“%d”,&l);

while(l!=20)

pr();

printf(“Поиск завешен \n”); }

pr()

{ extern int l;

printf(“Введите новое число \n”);

scanf(“%d”,&l); }

Если в функции pr() описание переменнойlбудет отсутствовать, внешняя переменнаяlбудет известна в функцииpr() по умолчанию. Если в функцииmain() и функцииpr() ключевое словоexternне будет включено в описание переменнойlвнутри функции, то под этим именем создается новая автоматическая переменная. Внешняя переменнаяlне известна будет этим функциям. Если словоexternопущено в описании переменнойlв функцииpr(), тогда переменнаяl, которая находится вmain() функции, никогда не получит нового значения.

Статические переменные. Статические переменные имеют локальную область действия, но в отличие от автоматических переменных они не исчезают, когда содержащая их функция закончит свою работу. Компилятор хранит их значения от одного вызова функции до другого.

main( )

{ int k;

for (k=1; k<=5; k++)

{ printf(“Интерация %d:\n”,k);

prnv( ); }

}

prnv( )

{ int av=1;

static int stv=1;

printf(“av=%d stv=%d\n”, av++, stv++); }

Функция prvnувеличивает каждую переменную после печати ее значения. Статическая переменнаяstv«помнит», что ее значение было увеличено по 1, в то время как для переменнойavначальное значение устанавливается каждый раз заново. Это указывает на разницу в инициализации:avинициализируется каждый раз, когда вызывается функцияprnv( ) , в то время какstvинициализируется только один раз при компиляции функцииprnv( ).

Итерация 1:

av=1stv=1

Итерация 2:

av=1stv=2

Итерация 3:

av=1stv=3

Итерация 4:

av=1stv=4

Итерация 5:

av=1stv=5

Итерация 6:

av=1stv=6

Регистровые переменные. Обычно переменные хранятся в памяти машины. Регистровые переменные запоминаются в регистрах центрального процессора, где доступ к ним и работа с ними выполняются гораздо быстрее, чем в памяти. В остальном регистровые переменные аналогичны автоматическим переменным. Они создаются следующим образом:

main()

{ register int rv;

……….. }

Если имеется описание регистровой переменной, компилятор сравнивает требования описания с количеством доступных регистров. Если требования не может быть выполнено, переменная становится автоматической переменной.

Классы памяти

Ключевое слово

Продолжительность существования

Область действия

Автоматический

auto

Временно

Локальная

Регистровый

register

Временно

Локальная

Статический

static

Постоянно

Локальная

Внешний

extern

Постоянно

Глобальная (все файлы)

Внешний статический

static

Постоянно

Глобальная (один файл)

Основная литература: 1осн[193-199],2осн[291-298],3осн[69-80]

Дополнительная литература:9доп[254-261]

Контрольные вопросы:

  1. Какие переменные сохраняются в регистрах центрального процессора?

  2. Для чего предназначены классы памяти?

  3. Какие переменные имеют локальную область действия и перестают существовать после окончания работы функции?

  4. Чем отличаются статические переменные от автоматических?

  5. Чем отличаются регистровые переменные от автоматических?