Clasele de stocare în C: Auto, Extern, Static, Register (Exemple)

⚡ Rezumat inteligent

Clasele de stocare din C definesc domeniul de aplicare, durata de viață, valoarea implicită și locația în memorie a fiecărei variabile, folosind patru specificatori - auto, register, static și extern - pentru a controla locul în care se află datele și cât timp acestea supraviețuiesc în timpul execuției.

  • 🗂️ Patru clase de depozitare: C oferă specificatori auto, register, static și extern pentru a descrie fiecare variabilă.
  • 🏠 Auto: Clasa locală implicită, limitată la blocul său și care reține o valoare nedorită până la atribuire.
  • ⚡ Inregistreaza-te: Solicită spațiu de stocare în registrele CPU pentru acces mai rapid la variabilele utilizate frecvent, cum ar fi contoarele.
  • ♻️ static: Păstrează o valoare variabilă între apelurile de funcții și implicit setează la zero la prima utilizare.
  • 🌐 Extern: Partajează o variabilă globală sau o funcție între mai multe fișiere sursă fără a o redefini.
  • 📊 Domeniu de aplicare și durată de viață: Fiecare clasă stabilește unde este vizibilă o variabilă și cât timp există.

Clasele de stocare în C

Ce este clasa de stocare în C?

O clasă de stocare reprezintă vizibilitatea și locația unei variabile. Ne spune din ce parte a codului putem accesa o variabilă. O clasă de stocare în C este folosită pentru a descrie următoarele lucruri:

  • Domeniul variabil.
  • Locația în care va fi stocată variabila.
  • Valoarea inițializată a unei variabile.
  • O durată de viață a unei variabile.
  • Cine poate accesa o variabilă?

Astfel, o clasă de stocare este utilizată pentru a reprezenta informația despre o variabilă.

NOTĂ: O variabilă nu este asociată doar cu o tip de date, valoarea sa dar și o clasă de stocare.

Care sunt tipurile de clase de stocare în C?

Există în total patru tipuri de clase de stocare standard. Tabelul de mai jos reprezintă clasele de stocare în C.

Clasa de depozitare Scop
Auto Este o clasă de stocare implicită.
extern Este o variabilă globală.
static Este o variabilă locală care este capabilă să returneze o valoare chiar și atunci când controlul este transferat la apelul funcției.
Inregistreaza-te Este o variabilă care este stocată într-un registru.

Clasa de stocare automată în C

Variabilele definite folosind clasa de stocare automată sunt numite variabile locale. Auto înseamnă clasa de stocare automată. O variabilă se află în clasa de stocare automată în mod implicit dacă nu este specificată în mod explicit.

Sfera de aplicare a unei variabile automate este limitată numai cu un anumit bloc. Odată ce controlul iese din bloc, accesul este distrus. Aceasta înseamnă că numai blocul în care este declarată variabila auto îl poate accesa.

Un cuvânt cheie auto este folosit pentru a defini o clasă de stocare automată. În mod implicit, o variabilă automată conține o valoare de gunoi.

Example, auto int age;

Programul de mai jos definește o funcție cu două variabile locale

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

Luăm un alt program care arată „nivelul de vizibilitate” la nivelul domeniului pentru variabilele automate din fiecare cod de bloc care sunt independent unul de celălalt:

#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);}

ieșire:

 3 2 1

Clasa de stocare externă în C

Extern înseamnă clasa de stocare externă. Clasa de stocare externă este folosită atunci când avem funcții globale sau variabile care sunt partajate între două sau mai multe fișiere.

Cuvântul cheie extern este utilizat pentru a declara o variabilă sau o funcție globală într-un alt fișier pentru a furniza referința variabilei sau funcției care a fost deja definită în fișierul original.

Variabilele definite folosind un cuvânt cheie extern sunt numite variabile globale. Aceste variabile sunt accesibile pe tot parcursul programului. Observați că variabila extern nu poate fi inițializată, a fost deja definită în fișierul original.

Example, extern void display();

Primul fișier: main.c

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

Al doilea dosar: original.c

#include <stdio.h>
i=48;

Rezultat:

 value of the external integer is = 48

Pentru a compila și a rula codul de mai sus, urmați pașii de mai jos

Pasul 1) Creați un proiect nou,

  • Selectați Aplicație de consolă
  • Faceți clic pe Go

Creați un proiect nou în Code Blocuri

Pasul 2) Selectați C și faceți clic pe Următorul

Selectați limbajul C

Pasul 3) Faceți clic pe Următorul

Faceți clic pe Următorul

Pasul 4) Introduceți detaliile și faceți clic pe Următorul

Introduceți detaliile proiectului

Pasul 5) Faceți clic pe Finalizare

Faceți clic pe Finalizare

Pasul 6) Puneți codul principal așa cum este arătat în programul anterior în fișierul main.c și salvați-l

Adăugați cod la main.c

Pasul 7) Creați un fișier C nou [Fișier -> nou -> Fișier gol], salvați-l (ca original.c) și adăugați-l la proiectul curent făcând clic pe „OK” în caseta de dialog.

Creați fișierul original.c

Pasul 8) Introduceți și salvați codul C al fișierului original.c prezentat în exemplul anterior, fără funcția main().

Adăugați cod la original.c

Pasul 9) Construiți și rulați proiectul. Rezultatul este prezentat în figura următoare

Ieșire program

Clasa de stocare statică în C

Variabilele statice sunt utilizate în funcție/fișier ca variabile statice locale. Ele pot fi folosite si ca a variabila globala

  • Variabila locală statică este o variabilă locală care își păstrează și stochează valoarea între apelurile de funcție sau bloc și rămâne vizibilă numai pentru funcția sau blocul în care este definită.
  • Variabilele globale statice sunt variabile globale vizibile doar fișierului în care sunt declarate.
Example: static int count = 10;

Rețineți că variabila statică are o valoare inițială implicită zero și este inițializată o singură dată în timpul de viață.

#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);}

Rezultat:

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

Variabilele globale sunt accesibile în întregul fișier, în timp ce variabilele statice sunt accesibile numai pentru o anumită parte a unui cod.

Durata de viață a unei variabile statice este în întregul cod al programului. O variabilă care este declarată sau inițializată folosind cuvântul cheie static conține întotdeauna zero ca valoare implicită.

Înregistrați clasa de stocare în C

Puteți utiliza clasa de stocare a registrelor atunci când doriți să stocați variabile locale în funcții sau blocuri în registrele CPU în loc de RAM pentru a avea acces rapid la aceste variabile. De exemplu, „contoarele” sunt un bun candidat pentru a fi stocate în registru.

Example: register int age;

Cuvântul cheie register este utilizat pentru a declara o clasă de stocare a registrelor. Variabilele declarate folosind clasa de stocare a registrelor au o durată de viață pe tot parcursul programului.

Este similar cu clasa de stocare automată. Variabila este limitată la un anumit bloc. Singura diferență este că variabilele declarate folosind clasa de stocare a registrului sunt stocate în registrele CPU în loc de memorie. Register are acces mai rapid decât cel al memoriei principale.

Variabilele declarate folosind clasa de stocare a registrului nu au o valoare implicită. Aceste variabile sunt adesea declarate la începutul unui program.

#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*/}
}

ieșire:

error: address of register variable 'weight' requested

Următorul tabel rezumă caracteristicile principale ale fiecărei clase de stocare care sunt utilizate în mod obișnuit în programarea C

Clasa de stocare Declarație Stocare Valoarea inițială implicită domeniu Toată viața
Auto În interiorul unei funcții/bloc Memorie Imprevizibil În cadrul funcției/blocului În cadrul funcției/blocului
Inregistreaza-te În interiorul unei funcții/bloc Registrele CPU Gunoi În cadrul funcției/blocului În cadrul funcției/blocului
extern În afara tuturor funcțiilor Memorie Zero Întregul fișier și alte fișiere în care variabila este declarată extern timpul de rulare a programului
Static (local) În interiorul unei funcții/bloc Memorie Zero În cadrul funcției/blocului timpul de rulare a programului
Static (global) În afara tuturor funcțiilor Memorie Zero Caritate timpul de rulare a programului

Întrebări frecvente

Domeniul de aplicare decide unde este vizibilă o variabilă în cod, în timp ce durata de viață decide cât timp rămâne în memorie. O variabilă poate avea un domeniu de aplicare de bloc, dar o durată de viață de durata de viață a programului.

Ambele creează variabile locale cu scop de bloc, dar le păstrează automat în memorie cu o valoare implicită „gușată”, în timp ce „register” solicită o stocare mai rapidă a registrului CPU și interzice preluarea adresei variabilei.

Nu. „register” este doar o cerere; compilatorul o poate ignora atunci când nu există niciun registru liber. Compilatoarele moderne optimizează automat utilizarea „register”, așa că cuvântul cheie este acum rareori necesar.

Variabilele statice și externe se află într-un segment de memorie inițializat cu zero pentru întregul program, deci încep de la zero. Variabilele automate reutilizează memoria stivei, keeping orice valoare a rămas în urmă.

O declarație externă anunță doar o variabilă definită în altă parte și nu poate fi inițializată. Definiția reală, într-un singur fișier, alocă spațiul de stocare, iar legătura conectează fiecare referință la aceasta.

În mare parte, dar nu chiar. C++ cuvântul cheie register a fost depreciat și a fost reutilizat auto pentru inferența de tip. static și extern se comportă similar, totuși C++ adaugă reguli de stocare thread_local și reguli de stocare pentru membrii clasei.

Da. Asistenții inteligenți artificiali descriu funcțiile auto, register, static și extern, sugerează specificatorul potrivit pentru fiecare variabilă și semnalează utilizarea necorespunzătoare, cum ar fi preluarea adresei unei variabile de registru.

Copilotul GitHub completează automat contoare statice, declarații externe între fișiere și indicii de înregistrare, apoi explică domeniul de aplicare și durata de viață în linie pe măsură ce tastați.

Rezumați această postare cu: