Описатели классов памяти
Различают два класса объектов: глобальные и локальные, но используют четыре описателя классов: extern, static, auto и register. Назначение и применение их приведено в табл. 9.1
Таблица 9.1
Классы памяти
Класс памяти | Ключевое слово | Время действия | Область действия |
1. Автоматический | auto | временно | локальная |
2. Регистровый | register | временно | локальная |
3. Статический | static | постоянно | локальная |
4. Внешний | extern | постоянно | глобальная (все файлы) |
5.Внешний статический | static | постоянно | глобальная (один файл) |
Классы 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 предполагает хранение переменной во внутреннем регистре процессора. Время жизни и область видимости регистровой переменной такая же, как и у автоматической. Если компилятор не может разместить эту переменную в регистре, то она трактуется как автоматическая. По умолчанию значение регистровых переменных не определено.
К регистровой переменной нельзя применить операцию & - определение адреса. Их нельзя описывать на внешнем уровне.
Дата добавления: 2017-06-02; просмотров: 478;