C-tallennusluokat: Automaattinen, Ulkoinen, Staattinen, Rekisteri (esimerkkejä)

⚡ Älykäs yhteenveto

C-kielen tallennusluokat määrittelevät jokaisen muuttujan laajuuden, elinkaaren, oletusarvon ja muistipaikan käyttämällä neljää määritettä – auto, register, static ja extern – hallitakseen datan sijaintia ja säilyvyysaikaa suorituksen aikana.

  • 🗂️ Neljä säilytysluokkaa: C tarjoaa auto-, register-, static- ja extern-määrittelijät jokaisen muuttujan kuvaamiseen.
  • 🏠 Auto: Oletusarvoinen paikallinen luokka, joka on rajoittunut lohkoonsa ja jonka arvo on roska, kunnes se on määritetty.
  • ilmoittautua: Pyytää CPU-rekisteritallennustilaa nopeampaa pääsyä varten usein käytettyihin muuttujiin, kuten laskureihin.
  • ♻️ Staattinen: Säilyttää muuttujan arvon funktiokutsujen välillä ja palauttaa oletusarvon nollaksi ensimmäisellä käyttökerralla.
  • 🌐 Ulkoinen: Jakaa globaalin muuttujan tai funktion useiden lähdetiedostojen välillä määrittelemättä sitä uudelleen.
  • 📊 Soveltamisala ja käyttöikä: Jokainen luokka määrittää, missä muuttuja on näkyvissä ja kuinka kauan se on olemassa.

Säilytysluokat C

Mikä on säilytysluokka C:ssä?

Tallennusluokka edustaa muuttujan näkyvyyttä ja sijaintia. Se kertoo mistä koodin osasta voimme käyttää muuttujaa. C:n tallennusluokkaa käytetään kuvaamaan seuraavia asioita:

  • Muuttuva laajuus.
  • Sijainti, johon muuttuja tallennetaan.
  • Muuttujan alustettu arvo.
  • Muuttujan elinikäinen.
  • Kuka voi käyttää muuttujaa?

Näin ollen tallennusluokkaa käytetään edustamaan muuttujaa koskevia tietoja.

HUOMAUTUS: Muuttuja ei liity vain tietotyyppi, sen arvo, mutta myös varastointiluokka.

Mitkä ovat C:n säilytysluokat?

Tavallisia säilytysluokkia on yhteensä neljä. Alla oleva taulukko esittää varastoluokat C-muodossa.

Varastointiluokka Tarkoitus
auto Se on oletustallennusluokka.
ulkoinen Se on globaali muuttuja.
staattinen Se on paikallinen muuttuja, joka pystyy palauttamaan arvon, vaikka ohjaus siirretään funktiokutsulle.
ilmoittautua Se on muuttuja, joka on tallennettu rekisteriin.

Automaattinen tallennusluokka C

Automaattisen tallennusluokan avulla määritettyjä muuttujia kutsutaan paikallisiksi muuttujiksi. Auto tarkoittaa automaattista säilytysluokkaa. Muuttuja on oletusarvoisesti automaattisen tallennusluokan luokassa, jos sitä ei ole erikseen määritetty.

Automaattisen muuttujan laajuus on rajoitettu vain tietylle lohkolle. Kun ohjaus menee ulos lohkosta, pääsy tuhoutuu. Tämä tarkoittaa, että vain se lohko, jossa automaattinen muuttuja on ilmoitettu, voi käyttää sitä.

Automaattisen tallennusluokan määrittämiseen käytetään avainsanaa auto. Oletusarvoisesti automaattinen muuttuja sisältää roskaarvon.

Example, auto int age;

Alla oleva ohjelma määrittelee funktion, jossa on kaksi paikallista muuttujaa

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

Otamme toisen ohjelman, joka näyttää laajuustason "näkyvyystason" automaattisille muuttujille kussakin lohkokoodissa, jotka ovat toisistaan ​​riippumattomia:

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

lähtö:

 3 2 1

Ulkoinen säilytysluokka C

Extern edustaa ulkoista tallennusluokkaa. Ulkoista tallennusluokkaa käytetään, kun meillä on globaaleja toimintoja tai muuttujia, jotka jaetaan kahden tai useamman tiedoston kesken.

Avainsanaa extern käytetään globaalin muuttujan tai funktion määrittämiseen toisessa tiedostossa, jotta saadaan viittaus muuttujaan tai funktioon, joka on jo määritelty alkuperäisessä tiedostossa.

Ulkoisella avainsanalla määritettyjä muuttujia kutsutaan globaaleiksi muuttujiksi. Nämä muuttujat ovat käytettävissä koko ohjelman ajan. Huomaa, että ulkoista muuttujaa ei voi alustaa, se on jo määritetty alkuperäisessä tiedostossa.

Example, extern void display();

Ensimmäinen tiedosto: main.c

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

Toinen tiedosto: original.c

#include <stdio.h>
i=48;

Tulos:

 value of the external integer is = 48

Kääntääksesi ja suorittaaksesi yllä olevan koodin, noudata alla olevia ohjeita

Vaihe 1) Luo uusi projekti,

  • Valitse Konsolisovellus
  • Napsauta Siirry

Luo uusi projekti kohteeseen Code Blocks

Vaihe 2) Valitse C ja napsauta Seuraava

Valitse C-kieli

Vaihe 3) Napsauta Seuraava

Napsauta Seuraava

Vaihe 4) Syötä tiedot ja napsauta Seuraava

Anna projektin tiedot

Vaihe 5) Napsauta Valmis

Napsauta Valmis

Vaihe 6) Lisää edellisessä ohjelmassa esitetty pääkoodi tiedostoon main.c ja tallenna se.

Lisää koodi main.c-tiedostoon

Vaihe 7) Luo uusi C-tiedosto [Tiedosto -> uusi -> Tyhjä tiedosto], tallenna se (kuten alkuperäinen.c) ja lisää se nykyiseen projektiin napsauttamalla valintaikkunassa "OK".

Luo alkuperäinen.c-tiedosto

Vaihe 8) Lisää ja tallenna edellisessä esimerkissä näytetyn original.c-tiedoston C-koodi ilman main()-funktiota.

Lisää koodi tiedostoon original.c

Vaihe 9) Rakenna ja suorita projektisi. Tulos näkyy seuraavassa kuvassa.

Ohjelman tuloste

Staattinen säilytysluokka C

Staattisia muuttujia käytetään funktiossa/tiedostossa paikallisina staattisina muuttujina. Niitä voidaan käyttää myös a globaali muuttuja

  • Staattinen paikallinen muuttuja on paikallinen muuttuja, joka säilyttää ja tallentaa arvonsa funktiokutsujen tai lohkon välillä ja jää näkyviin vain sille funktiolle tai lohkolle, jossa se on määritelty.
  • Staattiset globaalit muuttujat ovat globaaleja muuttujia, jotka näkyvät vain tiedostolle, jossa ne on määritelty.
Example: static int count = 10;

Muista, että staattisen muuttujan oletusalkuarvo on nolla ja se alustetaan vain kerran elinkaarensa aikana.

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

Tulos:

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

Yleiset muuttujat ovat käytettävissä koko tiedostossa, kun taas staattiset muuttujat ovat käytettävissä vain koodin tietyssä osassa.

Staattisen muuttujan elinikä on koko ohjelmakoodissa. Staattisella avainsanalla ilmoitettu tai alustettu muuttuja sisältää aina nollan oletusarvona.

Rekisteröidy tallennusluokkaan C

Voit käyttää rekisterin tallennusluokkaa, kun haluat tallentaa paikallisia muuttujia funktioihin tai lohkoihin CPU-rekistereihin sen sijaan, että RAM jotta pääset nopeasti käsiksi näihin muuttujiin. Esimerkiksi "laskurit" ovat hyvä kandidaatti tallennettavaksi rekisteriin.

Example: register int age;

Avainsanaa register käytetään rekisterin tallennusluokan määrittämiseen. Avainsanalla register storage class määritellyillä muuttujilla on elinkaari koko ohjelman ajan.

Se on samanlainen kuin automaattinen tallennusluokka. Muuttuja on rajoitettu tiettyyn lohkoon. Ainoa ero on, että rekisterin tallennusluokalla ilmoitetut muuttujat tallennetaan CPU-rekistereihin muistin sijaan. Rekisterillä on nopeampi pääsy kuin päämuistiin.

Rekisterin tallennusluokalla ilmoitetuilla muuttujilla ei ole oletusarvoa. Nämä muuttujat ilmoitetaan usein ohjelman alussa.

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

lähtö:

error: address of register variable 'weight' requested

Seuraavassa taulukossa on yhteenveto kunkin tallennusluokan tärkeimmistä ominaisuuksista, joita käytetään yleisesti C-ohjelmoinnissa

Varastointiluokka Ilmoitus varastointi Oletusalkuarvo Laajuus Elinikäinen
auto Toiminnon/lohkon sisällä Muisti ennalta arvaamaton Toiminnon/lohkon sisällä Toiminnon/lohkon sisällä
ilmoittautua Toiminnon/lohkon sisällä CPU-rekisterit Roskat Toiminnon/lohkon sisällä Toiminnon/lohkon sisällä
ulkoinen Kaikkien toimintojen ulkopuolella Muisti nolla Koko tiedosto ja muut tiedostot, joissa muuttuja on ilmoitettu ulkoiseksi ohjelman suoritusaika
Staattinen (paikallinen) Toiminnon/lohkon sisällä Muisti nolla Toiminnon/lohkon sisällä ohjelman suoritusaika
Staattinen (maailmanlaajuinen) Kaikkien toimintojen ulkopuolella Muisti nolla Global ohjelman suoritusaika

UKK

Muuttujan näkyvyysalue (Scope) määrittää, missä se näkyy koodissa, kun taas elinaika (lifetime) määrittää, kuinka kauan se pysyy muistissa. Muuttujalla voi olla lohkolaajuus, mutta sen elinikä voi olla ohjelman mittainen.

Molemmat luovat lohkolaajuisia paikallisia muuttujia, mutta auto pitää ne muistissa roska-oletusarvolla, kun taas register pyytää nopeampaa CPU-rekisteritallennusta ja estää muuttujan osoitteen ottamisen.

Ei. rekisteri on vain pyyntö; kääntäjä voi jättää sen huomiotta, jos mikään rekisteri ei ole vapaa. Nykyaikaiset kääntäjät optimoivat rekisterien käytön automaattisesti, joten avainsanaa tarvitaan nykyään harvoin.

Staattiset ja ulkoiset muuttujat sijaitsevat koko ohjelman ajan nolla-alustetussa muistisegmentissä, joten ne alkavat nollasta. Automaattiset muuttujat käyttävät pinomuistia uudelleen, pidäping mitä tahansa arvoa jäljelle jäi.

Extern-deklaraatio vain ilmoittaa muualla määritellyn muuttujan, eikä sitä voida alustaa. Varsinainen määritelmä yhdessä tiedostossa varaa tallennustilan, ja linkitys yhdistää kaikki viittaukset siihen.

Enimmäkseen, mutta ei aivan. C++ register-avainsana vanhentui ja auto-avainsanaa käytettiin uudelleen tyypin päättelyyn. static ja extern toimivat kuitenkin samalla tavalla. C++ lisää thread_local- ja class-member-tallennussäännöt.

Kyllä. Tekoälyavustajat kuvaavat automaattisen, rekisteri-, staattisen ja ulkoisen muuttujan, ehdottavat oikeaa määritettä kullekin muuttujalle ja merkitsevät väärinkäytökset, kuten rekisterimuuttujan osoitteen ottamisen.

GitHub Copilot täydentää automaattisesti staattiset laskurit, tiedostojen väliset ulkoiset määrittelyt ja rekisterivihjeet ja selittää sitten laajuuden ja elinkaaren kirjoittaessasi.

Tiivistä tämä viesti seuraavasti: