Что такое класс хранения?
Класс хранения представляет видимость и местоположение переменной. Он говорит, из какой части кода мы можем получить доступ к переменной. Класс хранения используется для описания следующих вещей:
- Область действия переменной.
- Место, где будет храниться переменная.
- Инициализированное значение переменной.
- Время жизни переменной.
- Кто может получить доступ к переменной?
Таким образом, класс хранения используется для представления информации о переменной.
ПРИМЕЧАНИЕ. Переменная связана не только с типом данных, его значением, но и с классом хранения.
Всего существует четыре типа стандартных классов хранения. В таблице ниже представлены классы хранения в «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) Создать новый проект,
- Выберите консольное приложение
- Нажмите 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.