Учебники

C — Классы хранения

Класс хранения определяет область действия (видимость) и время жизни переменных и / или функций в программе на Си. Они предшествуют типу, который они изменяют. У нас есть четыре разных класса хранения в программе на C —

  • авто
  • регистр
  • статический
  • внешний

Авто Класс Хранения

Класс автоматического хранения является классом хранения по умолчанию для всех локальных переменных.

{
   int mount;
   auto int month;
}

В приведенном выше примере определены две переменные в одном классе хранения. ‘auto’ может использоваться только внутри функций, то есть локальных переменных.

Класс хранения регистра

Класс хранения регистров используется для определения локальных переменных, которые должны храниться в регистре, а не в ОЗУ. Это означает, что переменная имеет максимальный размер, равный размеру регистра (обычно одно слово), и к ней не может быть применен унарный оператор ‘&’ (так как она не имеет места в памяти).

{
   register int  miles;
}

Регистр следует использовать только для переменных, которые требуют быстрого доступа, таких как счетчики. Следует также отметить, что определение «регистр» не означает, что переменная будет храниться в регистре. Это означает, что он МОЖЕТ храниться в реестре в зависимости от аппаратного обеспечения и ограничений реализации.

Статический класс хранения

Класс статического хранилища инструктирует компилятор сохранять локальную переменную в течение всей жизни программы, а не создавать и уничтожать ее каждый раз, когда она входит и выходит из области видимости. Следовательно, статические локальные переменные позволяют им сохранять свои значения между вызовами функций.

Статический модификатор также может применяться к глобальным переменным. Когда это сделано, область действия этой переменной будет ограничена файлом, в котором она объявлена.

В программировании на C, когда static используется в глобальной переменной, он вызывает совместное использование только одной копии этого члена всеми объектами этого класса.

Live Demo

#include <stdio.h>
 
/* function declaration */
void func(void);
 
static int count = 5; /* global variable */
 
main() {

   while(count--) {
      func();
   }
	
   return 0;
}

/* function definition */
void func( void ) {

   static int i = 5; /* local static variable */
   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 чаще всего используется, когда два или более файлов совместно используют одни и те же глобальные переменные или функции, как описано ниже.

Первый файл: 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 используется для объявления счетчика во втором файле, где, как и его определение в первом файле, main.c. Теперь скомпилируйте эти два файла следующим образом:

$gcc main.c support.c

Это произведет исполняемую программу a.out . Когда эта программа выполняется, она дает следующий результат —