Учебники

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

Что такое класс хранения?

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

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

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

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

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

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

В этом уроке вы узнаете

Авто класс хранения

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

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

Ключевое слово 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 

Внешний класс хранения

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

Ключевое слово 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) Создать новый проект,

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

Шаг 2) Выберите C и нажмите Next

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

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

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

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

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

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

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

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

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

  • Статическая локальная переменная — это локальная переменная, которая сохраняет и сохраняет свое значение между вызовами функции или блоком и остается видимой только для функции или блока, в котором она определена.
  • Статические глобальные переменные — это глобальные переменные, видимые только для файла, в котором они объявлены.
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

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

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

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

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

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

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

Резюме

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

  • Класс хранения используется для представления дополнительной информации о переменной.
  • Класс хранения представляет область действия и срок службы переменной.
  • Это также говорит, кто может получить доступ к переменной и откуда?
  • Auto, extern, register, static — четыре класса хранения в ‘C’.
  • auto используется для локальной переменной, определенной в блоке или функции
  • регистр используется для хранения переменной в регистрах процессора, а не в памяти для быстрого доступа.
  • Статика используется как для глобальных, так и для локальных переменных. Каждый из них имеет свой вариант использования в программе на Си.
  • Extern используется для обмена данными между файлами проекта C.