Классы хранения в C: Auto, Extern, Static, Register (примеры)

⚡ Умное резюме

В языке C классы хранения определяют область видимости, время жизни, значение по умолчанию и местоположение в памяти каждой переменной, используя четыре спецификатора — auto, register, static и extern — для управления тем, где хранятся данные и как долго они сохраняются во время выполнения.

  • 🇧🇷 Четыре класса хранения: В языке C для описания каждой переменной предусмотрены спецификаторы auto, register, static и extern.
  • 🏠 Авто: Класс по умолчанию является локальным, ограниченным своим блоком и хранящим некорректное значение до тех пор, пока ему не будет присвоено значение.
  • Регистр: Запрашивает место в регистрах ЦП для более быстрого доступа к часто используемым переменным, таким как счетчики.
  • ♻️ Статический: Сохраняет значение переменной между вызовами функции и по умолчанию принимает значение нуля при первом использовании.
  • 🌐 Внешний: Позволяет использовать глобальную переменную или функцию в нескольких исходных файлах без её переопределения.
  • 📊 Область применения и срок службы: Каждый класс определяет, где переменная видна и как долго она существует.

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

Что такое класс памяти в C?

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

  • Область видимости переменной.
  • Место, где будет храниться переменная.
  • Инициализированное значение переменной.
  • Время жизни переменной.
  • Кто может получить доступ к переменной?

Таким образом, класс хранения используется для представления информации о переменной.

ПРИМЕЧАНИЕ: Переменная связана не только с чем-либо. тип данных, его значение, но также и класс хранения.

Каковы типы классов хранения в C?

Всего существует четыре типа стандартных классов хранения. В таблице ниже представлены классы хранения данных в C.

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

Класс автоматического хранения в C

Переменные, определенные с использованием класса автоматического хранения, называются локальными переменными. Auto означает автоматический класс хранения. По умолчанию переменная находится в классе автоматического хранения, если она не указана явно.

Область действия автоматической переменной ограничена только конкретным блоком. Как только управление выходит из блока, доступ уничтожается. Это означает, что доступ к ней может получить только тот блок, в котором объявлена ​​переменная auto.

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

Example, auto int age;

В приведенной ниже программе определяется функция с двумя локальными переменными.

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

Мы возьмем еще одну программу, которая показывает уровень видимости «уровня видимости» для автоматических переменных в каждом блочном коде, которые независимы друг от друга:

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

Выход:

 3 2 1

Класс внешнего хранилища в C

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

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

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

Example, extern void display();

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

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

Второй файл: original.c

#include <stdio.h>
i=48;

Результат:

 value of the external integer is = 48

Чтобы скомпилировать и запустить приведенный выше код, выполните следующие действия.

Шаг 1) Создайте новый проект,

  • Выберите консольное приложение
  • Нажмите Go

Создать новый проект в Code Блоки

Шаг 2) Выберите C и нажмите «Далее».

Выберите язык C

Шаг 3) Нажмите «Далее».

Нажмите Далее

Шаг 4) Введите данные и нажмите «Далее».

Введите данные проекта

Шаг 5) Нажмите «Готово».

Нажмите Готово

Шаг 6) Поместите основной код, как показано в предыдущей программе, в файл main.c и сохраните его.

Добавьте код в файл main.c

Шаг 7) Создайте новый файл C [Файл -> Новый -> Пустой файл], сохраните его (как original.c) и добавьте в текущий проект, нажав «ОК» в диалоговом окне.

Создайте файл original.c

Шаг 8) Вставьте и сохраните код на языке C из исходного файла .c, показанного в предыдущем примере, без функции main().

Добавьте код в файл original.c

Шаг 9) Соберите и запустите свой проект. Результат показан на следующем рисунке.

Вывод программы

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

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

  • Статическая локальная переменная — это локальная переменная, которая сохраняет и сохраняет свое значение между вызовами функций или блоками и остается видимой только для функции или блока, в которых она определена.
  • Статические глобальные переменные — это глобальные переменные, видимые только тому файлу, в котором они объявлены.
Example: static int count = 10;

Имейте в виду, что статическая переменная имеет нулевое начальное значение по умолчанию и инициализируется только один раз за время своего существования.

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

Результат:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

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

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

Зарегистрировать класс хранилища в C

Вы можете использовать класс хранения регистров, если хотите хранить локальные переменные внутри функций или блоков в регистрах ЦП вместо Оперативная память чтобы иметь быстрый доступ к этим переменным. Например, «счетчики» — хорошие кандидаты для хранения в реестре.

Example: register int age;

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

Это похоже на класс автоматического хранения. Переменная ограничена конкретным блоком. Единственное отличие состоит в том, что переменные, объявленные с использованием класса хранения регистров, хранятся внутри регистров ЦП, а не в памяти. Регистр имеет более быстрый доступ, чем доступ к основной памяти.

Переменные, объявленные с использованием класса хранения регистров, не имеют значения по умолчанию. Эти переменные часто объявляются в начале программы.

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

Выход:

error: address of register variable 'weight' requested

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

Класс хранения Декларация Память Начальное значение по умолчанию Объем Вечного пользования
автоматический Внутри функции/блока Память Непредсказуемый Внутри функции/блока Внутри функции/блока
зарегистрироваться Внутри функции/блока Регистры процессора Мусор Внутри функции/блока Внутри функции/блока
внешний Вне всех функций Память                           0 Заполните файл и другие файлы целиком, в которых переменная объявлена ​​как extern. время выполнения программы
Статический (локальный) Внутри функции/блока Память                           0 Внутри функции/блока время выполнения программы
Статический (глобальный) Вне всех функций Память                           0 Глобальный время выполнения программы

Часто задаваемые вопросы (FAQ)

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

Оба механизма создают локальные переменные с областью видимости блока, но автоматический режим хранит их в памяти с произвольным значением по умолчанию, в то время как регистровый режим запрашивает более быстрое хранение данных в регистрах ЦП и запрещает получение адреса переменной.

Нет. Ключевое слово `register` — это всего лишь запрос; компилятор может проигнорировать его, если нет свободных регистров. Современные компиляторы автоматически оптимизируют использование регистров, поэтому ключевое слово `register` теперь требуется редко.

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

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

В основном, но не совсем. C++ Ключевое слово register устарело, а auto используется для вывода типов. Однако static и extern ведут себя аналогично. C++ Добавляет правила хранения thread_local и для членов класса.

Да. Искусственный интеллект описывает типы данных auto, register, static и extern, предлагает правильный спецификатор для каждой переменной и выявляет ошибки, например, получение адреса регистровой переменной.

Второй пилот GitHub Автозавершает статические счетчики, объявления внешних переменных в разных файлах и подсказки регистров, а затем поясняет область видимости и время жизни непосредственно по мере ввода.

Подведем итог этой публикации следующим образом: