Описатели классов памяти

Различают два класса объектов: глобальные и локальные, но используют четыре описателя классов: 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; просмотров: 427;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.