Классы хранения в C: разные типы классов хранения [с примерами]

Опубликовано: 2020-10-21

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

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

Научитесь создавать приложения, такие как Swiggy, Quora, IMDB и другие.

Оглавление

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

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

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

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

Четыре класса хранения в C объявлены в блоке или программе со спецификаторами класса хранения: auto, register, extern, static. Существует еще один спецификатор класса памяти, 'typedef', используемый в синтаксической форме и не резервирующий память. Спецификаторы инструктируют компилятор о сохранении переменных. Класс внешнего хранилища в C сообщает компилятору, что определенная переменная объявлена ​​с внешней связью.

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

Синтаксис:

storage_class_specifier тип_данных имя_переменной;

Читайте: Интересные идеи проектов и темы на C# для начинающих

Особый случай: когда спецификатор класса памяти не объявлен или не определен в программе.

В объявлении переменной указан как минимум один спецификатор класса хранения. Но в случае, если спецификатор класса хранения не указан, соблюдаются следующие правила:

1. Переменные, объявленные внутри функции, считаются автоматическими.

2. Функции, объявленные внутри функции, считаются внешними.

3. Переменные и функции, объявленные вне функции, считаются статическими с внешней связью .

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

В C есть четыре класса хранения , давайте посмотрим на них:

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

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

Простая программа, показывающая автоматические классы хранения:

#include <stdio.h>

основной ( )

{

авто целое я = 11;

{

авто целое я = 22;

{

авто целое я = 33;

printf ("%d", я);

}

printf ("%d", я);

}

printf ("%d", я);

}

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

3 2 1

Объяснение:

В приведенной выше программе переменная i объявляется трижды. Переменные с одинаковыми именами могут быть определены в разных блоках. Таким образом, эта программа будет успешно компилироваться и выполняться без каких-либо ошибок. Функция «printf» в самом внутреннем блоке напечатает 3, а переменная i в этом блоке будет уничтожена после завершения блока.

Следующий, второй внешний блок печатает 2, за которым следует внешний блок, который печатает 1. Автоматические переменные инициализируются правильно; иначе вы получите неопределенные значения, поскольку компилятор не дает им начальное значение.

2. Зарегистрируйте классы хранения в C

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

Простая программа, показывающая классы хранения регистров:

#include <stdio.h>

основной ()

{

зарегистрировать целое я = 10;

интервал *p = &i; //ошибка: запрошен адрес регистровой переменной

printf ("Значение i: %d", *p);

printf ("Адрес i: %u", p);

}

Объяснение:

В приведенной выше программе код пытается получить адрес переменной i в переменной-указателе p, но поскольку i объявлен как регистровая переменная, код не будет компилироваться и отобразит ошибку «Ошибка: запрошен адрес регистровой переменной». .

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

Узнайте: C++ против Java: разница между C++ и Java

3. Статические классы хранения в C

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

Простые программы, отображающие классы статической памяти с локальными и глобальными переменными:

я. Локальная переменная

#include <stdio.h>

аннулировать статическое демо()

{

статический интервал я;

{

статический интервал я = 1;

printf ("%d", я);

я++;

}

printf ("%d", я);

я++;

}

основной ()

{

статическая демонстрация();

статическая демонстрация();

}

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

1 0

2 1

Объяснение:

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

II. Глобальная переменная

#include <stdio.h>

статический интервал gInt = 1;

статическая пустота staticDemo()

{

статический интервал я;

printf ("%d", я);

я++;

printf ("%d", globalInt);

глобальныйInt++;

}

основной ()

{

статическая демонстрация();

статическая демонстрация();

}

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

0 1

1 2

Объяснение:

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

Когда глобальная переменная или функция определяется статическим спецификатором, эта переменная или функция известна только тому файлу, в котором она определена. Для глобальной переменной другие файловые подпрограммы не могут получить доступ и изменить ее содержимое, поскольку статическая глобальная переменная имеет внутреннюю связь. В приведенной выше программе статическая глобальная переменная globalInt и статическая функция staticDemo() определены как статические и не могут использоваться вне файла C.

4. Классы внешней памяти в C

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

Простая программа, показывающая классы внешней памяти:

#include <stdio.h>

внешний внутренний я;

основной ()

{

printf ("i:%d", i);

}

интервал я = 1;

Объяснение:

В приведенной выше программе C, если удалить extern int i, возникнет ошибка «Необъявленный идентификатор 'i', поскольку переменная i определена после использования в printf. Спецификатор extern указывает компилятору, что переменная i была определена и объявлена ​​здесь.

Если вы измените extern int i; для внешнего int я = 5; вы получите сообщение об ошибке «Переопределение 'i'», потому что спецификатор extern не инициализирует переменную.

Читайте также: Топ 7 захватывающих идей проектов на C для начинающих

Заключительные слова

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

Если вы хотите узнать больше и нуждаетесь в наставничестве от отраслевых экспертов, ознакомьтесь с дипломом PG upGrad & IIIT Banglore в области разработки программного обеспечения с полным стеком .

Подготовьтесь к карьере будущего

ДИПЛОМ UPGRAD И IIIT-BANGALORE PG В РАЗРАБОТКЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ПОЛНОГО СТЕКА
Зарегистрируйтесь сегодня