|
|||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Тема 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=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; ……….. } Если имеется описание регистровой переменной, компилятор сравнивает требования описания с количеством доступных регистров. Если требования не может быть выполнено, переменная становится автоматической переменной.
Основная литература: 1осн[193-199], 2осн[291-298], 3осн[69-80] Дополнительная литература: 6доп[254-261] Контрольные вопросы: 1. Какие переменные сохраняются в регистрах центрального процессора? 2. Для чего предназначены классы памяти? 3. Какие переменные имеют локальную область действия и перестают существовать после окончания работы функции? 4. Чем отличаются статические переменные от автоматических? 5. Чем отличаются регистровые переменные от автоматических? Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.) |