Lagerklasser i C: Auto, Ekstern, Statisk, Register (Eksempler)

⚡ Smart opsummering

Lagringsklasser i C definerer omfanget, levetiden, standardværdien og hukommelsesplaceringen for hver variabel ved hjælp af fire specifikationer - auto, register, static og extern - til at kontrollere, hvor data findes, og hvor længe de overlever under udførelsen.

  • 🗂️ Fire opbevaringsklasser: C tilbyder auto-, register-, statiske og eksterne specifikationer til at beskrive hver variabel.
  • 🏠 Bil: Standard lokale klasse, begrænset til sin blok og med en affaldsværdi, indtil den tildeles.
  • Tilmeld: Anmoder om CPU-register-lagring for hurtigere adgang til ofte anvendte variabler såsom tællere.
  • ♻️ Statisk: Bevarer en variabelværdi mellem funktionskald og indstilles som standard til nul ved første brug.
  • 🌐 Ekstern: Deler en global variabel eller funktion på tværs af flere kildefiler uden at omdefinere den.
  • 📊 Omfang og levetid: Hver klasse angiver, hvor en variabel er synlig, og hvor længe den lever.

Opbevaringsklasser i C

Hvad er opbevaringsklasse i C?

En lagerklasse repræsenterer synligheden og en placering af en variabel. Den fortæller fra hvilken del af koden vi kan få adgang til en variabel. En lagerklasse i C bruges til at beskrive følgende ting:

  • Det variable omfang.
  • Det sted, hvor variablen vil blive gemt.
  • Den initialiserede værdi af en variabel.
  • En variabels levetid.
  • Hvem kan få adgang til en variabel?

En lagerklasse bruges således til at repræsentere informationen om en variabel.

BEMÆRK: En variabel er ikke kun knyttet til en datatype, dens værdi, men også en opbevaringsklasse.

Hvad er typerne af opbevaringsklasser i C?

Der er i alt fire typer standardopbevaringsklasser. Tabellen nedenfor repræsenterer lagerklasserne i C.

Opbevaringsklasse Formål
auto Det er en standard opbevaringsklasse.
ekstern Det er en global variabel.
statisk Det er en lokal variabel, som er i stand til at returnere en værdi, selv når kontrol overføres til funktionskaldet.
register Det er en variabel, som er gemt i et register.

Autoopbevaringsklasse i C

De variabler, der er defineret ved hjælp af autolagringsklassen, kaldes lokale variabler. Auto står for automatisk opbevaringsklasse. En variabel er som standard i autolagringsklassen, hvis den ikke er eksplicit angivet.

Omfanget af en autovariabel er kun begrænset med den bestemte blok. Når kontrollen går ud af blokken, er adgangen ødelagt. Dette betyder, at kun den blok, hvori den automatiske variabel er erklæret, kan få adgang til den.

Et nøgleord auto bruges til at definere en autolagringsklasse. Som standard indeholder en automatisk variabel en skraldværdi.

Example, auto int age;

Programmet nedenfor definerer en funktion med to lokale variabler

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

Vi tager et andet program, som viser omfangsniveauet "synlighedsniveau" for autovariabler i hver blokkode, som er uafhængige af hinanden:

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

Output:

 3 2 1

Ekstern opbevaringsklasse i C

Extern står for ekstern opbevaringsklasse. Ekstern lagerklasse bruges, når vi har globale funktioner eller variabler, som deles mellem to eller flere filer.

Nøgleordet extern bruges til at deklarere en global variabel eller funktion i en anden fil for at angive referencen til en variabel eller funktion, der allerede er defineret i den originale fil.

Variablerne defineret ved hjælp af et eksternt nøgleord kaldes globale variabler. Disse variabler er tilgængelige i hele programmet. Bemærk, at den eksterne variabel ikke kan initialiseres, den er allerede defineret i den originale fil.

Example, extern void display();

Første fil: main.c

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

Anden fil: original.c

#include <stdio.h>
i=48;

Resultat:

 value of the external integer is = 48

Følg nedenstående trin for at kompilere og køre ovenstående kode

Trin 1) Opret nyt projekt,

  • Vælg Konsolapplikation
  • Klik på Gå

Opret nyt projekt i Code Blocks

Trin 2) Vælg C og klik på Næste

Vælg C-sprog

Trin 3) Klik på Næste

Klik på Næste

Trin 4) Indtast oplysningerne, og klik på Næste

Indtast projektoplysninger

Trin 5) Klik på Udfør

Klik på Afslut

Trin 6) Indsæt hovedkoden som vist i det forrige program i main.c-filen og gem den.

Tilføj kode til main.c

Trin 7) Opret en ny C-fil [Fil -> ny -> Tom fil], gem den (som original.c) og tilføj den til det aktuelle projekt ved at klikke på “OK” i dialogboksen.

Opret original.c-fil

Trin 8) Indsæt og gem C-koden fra den originale .c-fil, der er vist i det foregående eksempel, uden main()-funktionen.

Tilføj kode til original.c

Trin 9) Byg og kør dit projekt. Resultatet vises i den næste figur.

Programoutput

Statisk opbevaringsklasse i C

De statiske variabler bruges i funktion/fil som lokale statiske variable. De kan også bruges som en global variabel

  • Statisk lokal variabel er en lokal variabel, der bevarer og gemmer sin værdi mellem funktionskald eller blok og forbliver kun synlig for den funktion eller blok, hvori den er defineret.
  • Statiske globale variabler er globale variabler, der kun er synlige for den fil, hvori de er deklareret.
Example: static int count = 10;

Husk, at den statiske variabel har en standard begyndelsesværdi nul og initialiseres kun én gang i sin levetid.

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

Resultat:

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

Globale variabler er tilgængelige i hele filen, mens statiske variabler kun er tilgængelige for den bestemte del af en kode.

Levetiden for en statisk variabel er i hele programkoden. En variabel, som er erklæret eller initialiseret ved hjælp af statisk nøgleord, indeholder altid nul som standardværdi.

Registrer lagerklasse i C

Du kan bruge registerlagerklassen, når du vil gemme lokale variabler i funktioner eller blokke i CPU-registre i stedet for RAM at have hurtig adgang til disse variabler. For eksempel er "tællere" en god kandidat til at blive opbevaret i registret.

Example: register int age;

Nøgleordet register bruges til at deklarere en register storage-klasse. De variabler, der deklareres ved hjælp af register storage-klassen, har en levetid gennem hele programmet.

Det ligner autolagringsklassen. Variablen er begrænset til den pågældende blok. Den eneste forskel er, at de variabler, der er erklæret ved hjælp af registerlagerklasse, er gemt i CPU-registre i stedet for en hukommelse. Register har hurtigere adgang end hovedhukommelsen.

De variabler, der er erklæret ved hjælp af registerlagerklasse, har ingen standardværdi. Disse variable er ofte erklæret i begyndelsen af ​​et 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*/}
}

Output:

error: address of register variable 'weight' requested

Den næste tabel opsummerer de vigtigste træk ved hver lagerklasse, som er almindeligt anvendt i C-programmering

Opbevaringsklasse Erklæring Opbevaring Standard startværdi Anvendelsesområde Levetid
auto Inde i en funktion/blok Hukommelse Uforudsigelige Inden for funktionen/blokken Inden for funktionen/blokken
register Inde i en funktion/blok CPU registre Affald Inden for funktionen/blokken Inden for funktionen/blokken
ekstern Udenfor alle funktioner Hukommelse Zero Hele filen og andre filer, hvor variablen er erklæret som ekstern programmets køretid
Statisk (lokal) Inde i en funktion/blok Hukommelse Zero Inden for funktionen/blokken programmets køretid
Statisk (global) Udenfor alle funktioner Hukommelse Zero Global programmets køretid

Ofte Stillede Spørgsmål

Scope bestemmer, hvor en variabel er synlig i koden, mens lifetime bestemmer, hvor længe den forbliver i hukommelsen. En variabel kan have et blok-scope, men samtidig have en program-lang levetid.

Begge opretter blokbegrænsede lokale variabler, men auto gemmer dem i hukommelsen med en "garbage"-standard, mens register anmoder om hurtigere CPU-register-lagring og forbyder at tage variabeladressen.

Nej, register er kun en anmodning; compileren kan ignorere den, når ingen register er ledig. Moderne compilere optimerer brugen af ​​register automatisk, så nøgleordet er nu sjældent nødvendigt.

Statiske og eksterne variabler findes i et nulinitialiseret hukommelsessegment for hele programmet, så de starter ved nul. Autovariabler genbruger stakhukommelse, keeping hvilken værdi der endte tilbage.

En ekstern deklaration annoncerer kun en variabel, der er defineret et andet sted, og som ikke kan initialiseres. Den virkelige definition, i én fil, allokerer lagerpladsen, og linkning forbinder alle referencer til den.

For det meste, men ikke helt. C++ udfasede register-nøgleordet og genanvendte auto til typeinferens. static og external opfører sig dog på samme måde. C++ tilføjer thread_local og klassemedlemslagringsregler.

Ja. AI-assistenter beskriver auto, register, static og external, foreslår den rigtige specifikator for hver variabel og markerer misbrug, såsom at tage adressen på en registervariabel.

GitHub Copilot autofuldfører statiske tællere, eksterne deklarationer på tværs af filer og registrerer hints, og forklarer derefter omfang og levetid indlejret, mens du skriver.

Opsummer dette indlæg med: