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

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

Эти спецификаторы размещаются перед типом, который они изменяют.

Ниже перечислены классы хранения, доступные в программах на C:

  • auto
  • регистр
  • static
  • extern

auto класс памяти

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

Переменные, определённые в функции, по умолчанию относятся к классу памяти auto, то есть создаются при запуске функции и уничтожаются при её завершении.

{
   int mount;
   auto int month;
}

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

класс памяти register

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

Класс памяти register определяет хранение в регистрах, поэтому доступ к переменной быстрее, но к ней нельзя обратиться напрямую, поскольку она не хранится в ОЗУ. Использование класса памяти register для переменных, к которым требуется частый доступ, может повысить скорость работы программы.

{
   register int  miles;
}

Регистры используются только для переменных, требующих быстрого доступа, например счётчиков. Следует также отметить, что определение 'register' не означает, что переменная будет храниться в регистре; это означает, что переменная может храниться в регистре, в зависимости от аппаратных ограничений и ограничений реализации.

static класс памяти

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

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

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

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

Следующий пример демонстрирует применение static для изменения глобальных и локальных переменных:

Пример

#include <stdio.h> /*Объявление функции*/ void func1(void); static int count=10; /*Глобальные переменные — static используется по умолчанию*/ int main() { while (count--) { func1(); } return 0; } void func1(void) { /*'thingy' — локальная переменная 'func1' — инициализируется только один раз * Значение 'thingy' не будет сбрасываться каждый раз, когда вызывается функция 'func1'.*/ static int thingy=5; thingy++; printf("thingy is %d, count is %d\n", thingy, count); }

В примере count — это глобальная переменная, которую можно использовать внутри функций; после того как thingy модифицируется с помощью static, она не будет сбрасываться при каждом вызове.

Вы можете ещё не понимать этот пример, потому что я уже использовал функции и глобальные переменные — две концепции, которые до сих пор не объяснялись. Даже если сейчас вы не можете полностью понять его, это не имеет значения; мы подробно объясним это в следующих главах. Когда приведённый выше код скомпилирован и выполнен, он выдаёт следующие результаты:

 thingy 为 6 , count 为 9
 thingy 为 7 , count 为 8
 thingy 为 8 , count 为 7
 thingy 为 9 , count 为 6
 thingy 为 10 , count 为 5
 thingy 为 11 , count 为 4
 thingy 为 12 , count 为 3
 thingy 为 13 , count 为 2
 thingy 为 14 , count 为 1
 thingy 为 15 , count 为 0

extern класс памяти

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

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

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

Модификатор extern обычно используется, когда два или более файлов совместно используют одну и ту же глобальную переменную или функцию, как показано ниже:

Первый файл: main.c

Пример

#include <stdio.h> int count ; extern void write_extern(); int 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.ccount. Теперь скомпилируйте эти два файла следующим образом:

 $ gcc main.c support.c

Это создастa.outисполняемую программу; при выполнении программа выдаёт следующие результаты:

count is 5
Другие расширения