Предыдущая статья: “Язык C: константы и литералы”
Классы памяти определяют область видимости и время жизни переменных и/или функций в программе, написанной на языке С. Они предшествуют типу, который модифицируют. В языке С различают четыре класса памяти:
- auto (автоматический);
- register (регистровый);
- static (статический);
- extern (внешний).
Класс памяти auto
Все локальные переменные по умолчанию принадлежат классу памяти auto
, то есть являются автоматическими.
{
int mount;
auto int month;
}
В приведенном примере две переменные определены в одном классе памяти. Использование auto
возможно только внутри функций, т.е. для создания локальных переменных.
Класс памяти register
Класс памяти register
используется для определения локальных переменных, которые должны храниться в регистре процессора, а не в оперативной памяти. Это означает, что переменная имеет максимальный размер, равный размеру регистра (обычно одно слово), и к ней не может быть применен унарный оператор &
(из-за отсутствия места в памяти).
{
register int miles;
}
Класс register
следует использовать только для переменных, требующих быстрого доступа, таких как счетчики. Следует также отметить, что определение register
не означает, что переменная обязательно будет храниться в register
. Это означает, что она МОЖЕТ храниться в register
в зависимости от аппаратных ограничений и ограничений, связанных с выполнением программы.
Класс памяти static
Класс памяти static
инструктирует компилятор поддерживать локальную переменную в течение всего времени жизни программы вместо того, чтобы создавать и уничтожать ее каждый раз, когда она входит и выходит из области видимости. Таким образом, статичность локальных переменных позволяет им сохранять свои значения между вызовами функций.
Модификатор static
также может быть применен к глобальным переменным. В этом случае область видимости переменной ограничивается файлом, в котором она объявлена.
В программировании на языке С применение static
к глобальной переменной приводит к тому, что только один экземпляр этого члена разделяется всеми объектами его класса:
#include <stdio.h>
/* объявление функции */
void func(void);
static int count = 5; /* глобальная переменная*/
main() {
while(count--) {
func();
}
return 0;
}
/* определение функции */
void func( void ) {
static int i = 5; /* локальная статичная переменная */
i++;
printf("i is %d and count is %d\n", i, count);
}
Результат:
i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0
Класс памяти extern
Класс памяти extern используется для того, чтобы дать ссылку на глобальную переменную, которая видна ВСЕМ файлам программы. Использование extern
не может инициализировать переменную, однако указывает на имя переменной в месте памяти, определенное ранее.
При наличии нескольких файлов и определении глобальной переменной или функции, которая также будет использоваться в других файлах, extern
применяется в другом файле для обеспечения ссылки на определенную переменную или функцию. Проще говоря, extern
используется для объявления глобальной переменной или функции в другом файле.
Модификатор extern чаще всего применяется при наличии двух или более файлов, в которых используют одни и те же глобальные переменные или функции, как показано ниже.
Первый файл: main.c
#include <stdio.h>
int count ;
extern void write_extern();
main() {
count = 5;
write_extern();
}
Второй файл: support.c
#include <stdio.h>
extern int count;
void write_extern(void) {
printf("count is %d\n", count);
}
Как видите, extern
используется для объявления count
во втором файле, тогда как определение count
находится в первом файле main.c. Теперь скомпилируем эти два файла следующим образом:
$gcc main.c support.c
Получится исполнимая программа a.out. Ее выполнение приведет к следующему результату:
count is 5
Читайте также:
Читайте нас в Telegram, VK и Яндекс.Дзен