Класи зберігання в C: Auto, Extern, Static, Register (приклади)

⚡ Розумний підсумок

Класи сховища в C визначають область дії, час життя, значення за замовчуванням та розташування в пам'яті кожної змінної, використовуючи чотири специфікатори — auto, register, static та extern — для контролю місця зберігання даних та тривалості їх зберігання під час виконання.

  • 🗂️ Чотири класи зберігання: У мові C для опису кожної змінної передбачено специфікатори auto, register, static та extern.
  • ???? Автомобіль: Локальний клас за замовчуванням, обмежений своїм блоком і містить сміттєве значення до призначення.
  • Реєстрація: Запитує пам'ять регістрів процесора для швидшого доступу до часто використовуваних змінних, таких як лічильники.
  • ♻️ Статична: Зберігає значення змінної між викликами функцій та встановлює значення за замовчуванням на нуль під час першого використання.
  • 🌐 Зовнішній: Спільно використовує глобальну змінну або функцію в кількох вихідних файлах без її перевизначення.
  • 📊 Сфера застосування та термін служби: Кожен клас визначає, де змінна буде видимою та як довго вона буде існувати.

Класи зберігання в C

Що таке клас зберігання в C?

Клас зберігання представляє видимість і розташування змінної. Він повідомляє, з якої частини коду ми можемо отримати доступ до змінної. Клас зберігання в C використовується для опису таких речей:

  • Область змінної.
  • Місце, де буде зберігатися змінна.
  • Ініціалізоване значення змінної.
  • Тривалість життя змінної.
  • Хто може отримати доступ до змінної?

Таким чином, клас зберігання використовується для представлення інформації про змінну.

ПРИМІТКА: Змінна не лише пов'язана з тип даних, його значення, а також клас зберігання.

Які є типи класів зберігання в C?

Всього існує чотири типи стандартних класів зберігання. У таблиці нижче представлено класи зберігання в C.

Клас зберігання Мета
автоматичний Це клас зберігання за замовчуванням.
зовнішній Це глобальна змінна.
статичний Це локальна змінна, яка здатна повертати значення, навіть якщо керування передано виклику функції.
реєструвати Це змінна, яка зберігається всередині реєстру.

Автоматичний клас зберігання в C

Змінні, визначені за допомогою класу автоматичного зберігання, називаються локальними змінними. 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, називаються глобальними змінними. Ці змінні доступні в усій програмі. Зауважте, що зовнішню змінну не можна ініціалізувати, її вже визначено у вихідному файлі.

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) та додайте до поточного проєкту, натиснувши кнопку «OK» у діалоговому вікні.

Створити файл original.c

Крок 8) Вставте та збережіть C-код оригінального файлу .c, показаного в попередньому прикладі, без функції main().

Додати код до original.c

Крок 9) Зберіть та запустіть свій проект. Результат показано на наступному рисунку

Вихід програми

Статичний клас зберігання в C

Статичні змінні використовуються у функції/файлі як локальні статичні змінні. Їх також можна використовувати як a глобальна змінна

  • Статична локальна змінна — це локальна змінна, яка зберігає та зберігає своє значення між викликами функції чи блоком і залишається видимою лише для функції чи блоку, у якому вона визначена.
  • Статичні глобальні змінні — це глобальні змінні, видимі лише для файлу, в якому вони оголошені.
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

Клас зберігання Декларація зберігання Початкове значення за умовчанням Сфера Тривалість Життя
автоматичний Всередині функції/блоку пам'ять Непередбачуваний У межах функції/блоку У межах функції/блоку
реєструвати Всередині функції/блоку Регістри ЦП Сміття У межах функції/блоку У межах функції/блоку
зовнішній Поза всіма функціями пам'ять Нульовий Весь файл та інші файли, де змінна оголошена як extern час виконання програми
Статичний (локальний) Всередині функції/блоку пам'ять Нульовий У межах функції/блоку час виконання програми
Статичний (глобальний) Поза всіма функціями пам'ять Нульовий Глобальний час виконання програми

Поширені запитання

Область видимості визначає, де змінна буде видимою в коді, тоді як час життя визначає, як довго вона залишатиметься в пам'яті. Змінна може мати блочну область видимості, але час життя триватиме стільки ж, скільки й програма.

Обидва створюють локальні змінні з блочною областю дії, але auto зберігає їх у пам'яті зі значенням за замовчуванням "сміття", тоді як register запитує швидше зберігання в регістрі процесора та забороняє отримання адреси змінної.

Ні. register — це лише запит; компілятор може проігнорувати його, якщо жоден регістр не вільний. Сучасні компілятори автоматично оптимізують використання регістрів, тому ключове слово зараз рідко потрібне.

Статичні та зовнішні змінні знаходяться в сегменті пам'яті, ініціалізованому нулем, для всієї програми, тому вони починаються з нуля. Автоматичні змінні повторно використовують стекову пам'ять, зберігаючиping будь-яка цінність, що залишилася після них.

Зовнішнє оголошення лише оголошує змінну, визначену деінде, і не може бути ініціалізованою. Справжнє визначення в одному файлі виділяє пам'ять, а зв'язування пов'язує кожне посилання на неї.

Здебільшого, але не зовсім. C++ ключове слово register скасовано та перепрофільовано на auto для виведення типів. static та extern поводяться подібно, хоча C++ додає правила зберігання thread_local та членів класу.

Так. Помічники ШІ описують auto, register, static та extern, пропонують правильний специфікатор для кожної змінної та позначають неправильне використання, таке як отримання адреси регістрової змінної.

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

Підсумуйте цей пост за допомогою: