- •1.2 Функции пользователя
- •1.2.1 Общие моменты
- •1.2.2 Изменение переменных в функции из других функций
- •1.2.3 Рекурсивные вызовы функций
- •1.2.4 Функции с переменным количеством параметров
- •1.2.5 Перегрузка функций
- •1.2.6 Передача функций в качестве параметров
- •1.3 Структуры
- •1.4 Битовые поля
- •1.5 Объединения
- •2 Оператор описания типа
- •3 Оператор описания объекта
- •3.1 Классы памяти
- •4 Преобразование типов
- •4.2.1 Неявные преобразования
- •4.2.2 Явные преобразования
- •5 Директивы препроцессора языка си
3 Оператор описания объекта
Вспомним вид оператора описания объекта (переменной):
класс_памяти тип_данных имя_объекта;
где класс памяти и тип данного может быть опущен.
Далее рассмотрим более детально классы памяти в рамках языка СИ.
3.1 Классы памяти
Все объекты (участки памяти), которые мы вводим в программе, имеют имена, через которые мы получаем доступ к участку памяти, который выделен под этот объект. А каждое имя характеризуются временем жизни и областью действия.
Время жизни – определяет период в течение которого имени объекта соответствует конкретные объекты в памяти (т.е. как долго участок память будет занят этим именем).
Область действия – это часть программы, в которой имя объекта может быть использовано для доступа к связанному с ним участку памяти.
Так вот эти да свойства определяет класс памяти, который поставлен в соответствие введенному в программе объекту.
Блок – все, что ограничено фигурными скобками.
Существует 4 разновидности классов:
auto – автоматически выделяемая, локальная память. Для имен с таким классом памяти выделяется память при входе в блок и освобождается при выходе из него. Всем объектам, которые описываются внутри блока присваивается класс памяти auto по умолчанию.
Пример:
main()
{
{
auto int a,b;
a=3;
}
{ float a; a=3.1;}
}
register – данный класс памяти подобен auto, но для размещения значений объекта используются по возможности регистры, а не участки основной памяти. Если регистры заняты то данные этого класса памяти обрабатываются как auto.
static – объект с таким классом памяти существует в процессе выполнения всех блоков, т.е. он будет существовать только в пределах того файла с исходным текстом программы, где он определен. В отличие от auto для объектов типа static память выделяется только один раз в начале выполнения программы, и они существуют пока программа выполняется. Всем объектом, которые описаны над всеми блоками присваивается класс памяти static по умолчанию. Данный класс может быть приписан и переменной и функции.
Пример:
int a;
main()
{
{
auto int c,b;
a=3;
}
{ float c; a=3.1;}
}
extern – объект данного класса глобален, т.е. доступен во всех файлах программы. Данный класс может быть приписан и переменной и функции. Блок памяти, ассоциированный с данным именем, занят им до конца исполнения программы.
Пример:
Таким образом, если говорить о времени жизни объекта выделяют: статическое, локальное и динамическое.
Статическое – память для объекта выделяется в начале программы и сохраняется до конца ее исполнения.
Локальное - память для объекта выделяется при каждом входе в блок, где этот объект описан, и освобождается от этого объекта, когда осуществляется выход из этого блока.
Динамическое – память под объекты выделяется и освобождается явно при помощи специальных операторов в процессе выполнения программы.
С понятием область действия связано понятие видимость объекта, которая связано с возможностью повторных определений объектов внутри вложенных блоков (использование одних и тех же имен). На примере объяснить.