Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Описатели классов памяти
Различают два класса объектов: глобальные и локальные, но используют четыре описателя классов: extern, static, auto и register. Назначение и применение их приведено в табл. 9.1 Таблица 9.1
Классы памяти
Классы 1, 2 и 3 описываются внутри функций; Классы 4 и 5 описываются вне функций. По умолчанию (без спецификаторов класса памяти) переменные, описанные внутри функции, являются автоматическими. Переменные, описанные вне функций по умолчанию - глобальные. Класс памяти extern указывает, что глобальная переменная описана где-то в другом месте (в этом или другом файле). Таким образом, описатель extern позволяет только сослаться на описание, сделанное в другом месте. Для того, чтобы описание extern было корректным, необходимо чтобы описание самой переменной существовало только один раз в любом из файлов, образующих текст программы, например:
Файл 1 файл 2 файл 3 … … … float p=0.33; extern float p; extern float p;
Замечание: Описание вида: extern тип имя_ переменной = значение; недопустимо. Если переменная внутри функции имеет класс памяти extern, то она может быть описана только после описания этой функции, например: Неправильно Правильно … … main () main () { { … … } } 6 func_1() func_1() { { k = k+2 extern int k; } k = k+2; int k = 10 } … int k =10; … Ошибка состоит в том, что область видимости переменной начинается с точки ее описания. Глобальные переменные могут быть инициализированы: явно: int k = 10; static float a = 20.52; неявно int k; static float a; При неявной инициализации переменным присваиваются нулевые значения. Класс памяти static на внешнем уровне маскирует описание переменных внутри файла, в котором они описаны. Другим файлам они не недоступны. Класс памяти register предполагает хранение переменной во внутреннем регистре процессора. Время жизни и область видимости регистровой переменной такая же, как и у автоматической. Если компилятор не может разместить эту переменную в регистре, то она трактуется как автоматическая. По умолчанию значение регистровых переменных не определено. К регистровой переменной нельзя применить операцию & - определение адреса. Их нельзя описывать на внешнем уровне.
|