Описание переменных. Классы памяти
1. Описание переменных. Классы памяти.
Описание вводит в программу имя, указав его тип и, возможно, начальное значение.
Имя (идентификатор) следует описать прежде, чем оно будет использоваться в программе на С. Это означает, что нужно указать его тип, чтобы транслятор знал, к какого вида объектам относится имя. Ниже приведены несколько примеров, иллюстрирующих все разнообразие описаний:
char ch;
int count = 1;
float eps=1.0e-5;
const double pi = 3.1415926535897932385;
Из этих примеров видно, что роль описаний не сводится лишь к привязке типа к имени. Большинство указанных описаний одновременно являются определениями, т.е. они создают объект, на который ссылается имя. Для ch, count, eps таким объектом является элемент памяти соответствующего размера. Этот элемент будет использоваться как переменная, и говорят, что для него отведена память. Для константы pi объектом будет число 3.1415926535897932385. Инициализация неавтоматической переменной осуществляется только один раз – перед тем, как программа начнет выполняться, при этом начальное значение должно быть константным выражением. Явно инициализируемая автоматическая переменная получает начальное значение каждый раз при входе в функцию или блок, ее начальным значением может быть любое выражение. Внешние и статические переменные по умолчанию получают нулевые значения. Автоматические переменные, явным образом не инициализированные, содержат неопределенные значения.
К любой переменной в объявлении может быть применен квалификатор const для указания того, что ее значение далее не будет изменяться.
const double pi = 3.1415926535897932385;
Информация в лекции "Тема 8. Основные системы мозга (часть 1)" поможет Вам.
const char msg[]=”предупреждение:”;
Применительно к массиву квалификатор const указывает на то, что ни один из его элементов не будет меняться. Указание const можно также применить к аргументу-массиву, чтобы сообщить, что функция не изменяет этот массив:
int strl(const char[]);
Существует два класса памяти: автоматический и статический. Несколько ключевых слов в совокупности с контекстом объявлений объектов специфицируют класс памяти для этих объектов.
Автоматические объекты локальны в блоке, при выходе из него они “исчезают”. Объявление, заданное внутри блока, если в нем отсутствует спецификатор класса памяти или указан спецификатор auto, создается автоматический объект. Объект, помеченный в объявлении словом register, является автоматическим и размещается по возможности в регистре машины.
Статические объекты могут быть локальными в блоке или располагаться вне блоков, но в обоих случаях их значения сохраняются после выхода из блока(или функции) до повторного в него входа. Внутри блока(в том числе и в блоке, образующем тело функции) статические объекты в объявлениях помечаются словом static. Объекты, объявляемые вне всех блоков на одном уровне с определениями функции, всегда статические. С помощью ключевого слова static их можно сделать локальными в пределах транслируемой единицы(в этом случае они получают атрибут внутренней связи), и они становятся глобальными для всей программы, если опустить явное указание класса памяти или использовать ключевое слово extern(в этом случае они получают атрибут внешней связи).