АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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

Читайте также:
  1. Biglnteger Классы
  2. Object классы
  3. Абстрактные классы и чистые виртуальные функции. Виртуальные деструкторы. Дружественные функции. Дружественные классы.
  4. Авторефераты3.2. Идентификация и разработка стратегических альтернатив
  5. Анатомия памяти
  6. Биохимия памяти
  7. В России есть и свои таланты по данному направлению, которые наиболее узнаваемы и мастер-классы которых ждут с нетерпением, такие, как
  8. Ввод, индикация, и изменение содержимого памяти
  9. Виды памяти
  10. Виды памяти
  11. Виды памяти
  12. Виды памяти

Класс памяти определяет область действия переменной и продолжительность ее существования в памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Ранее при рассмотрении функций было отмечено, что переменные, описанные в функции как локальные переменные, доступны только внутри функции. Для того, чтобы использовать переменную в нескольких функциях, необходимо описать ее как внешнюю переменную. Переменные, определенные вне функции, являются внешними и имеют глобальную область действия. Каждая переменная имеет тип, а также она принадлежит к некоторому классу памяти. Для описания классов памяти используется четыре ключевых слова: для описания внешнего класса используется ключевое слово 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=1 stv=1

Итерация 2:

av=1 stv=2

Итерация 3:

av=1 stv=3

Итерация 4:

av=1 stv=4

Итерация 5:

av=1 stv=5

Итерация 6:

av=1 stv=6

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

main()

{ register int rv;

……….. }

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

Классы памяти Ключевое слово Продолжительность существования Область действия
Автоматический auto Временно Локальная
Регистровый register Временно Локальная
Статический static Постоянно Локальная
Внешний extern Постоянно Глобальная (все файлы)
Внешний статический static Постоянно Глобальная (один файл)

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

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

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

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

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

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

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

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)