Download - Limbaj de programare C8

Transcript
  • 7/31/2019 Limbaj de programare C8

    1/20

    Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

    Cursul VIII

    Limbaje deprogramare

  • 7/31/2019 Limbaj de programare C8

    2/20

    Funcii,pointeri,clasedememorie

    Dac oexpresie este transmis caargumentpentru ofuncie,atunci secreeaz ocopie avalorii expresiei caresetransmite.

    nlimbajul C sefolosete apel prinvaloare ("callbyvalue").

    nalte limbaje o funcie poate schimba valoarea lui v(apel

    prinreferin "callbyreference").

    Vom simula apelul prinreferin transmind adreselevariabilelor caargumente napelul funciei.

    2 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    3/20

    Pointeri

    Dac v este ovariabil,atunci &v este adresa (sau locaia)

    ei nmemorie.Operatorul deadres & este unar i are

    aceeai preceden i asociativitate caceilali operatoriunari.

    Operatorul deindirectare (sau dederefereniere)*seaplic unui pointer i returneaz valoarea scris nmemorie laadresa dat depointer.

    3 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    4/20

    Apelprinreferin#include

    void interschimba(int *, int *);

    void main()

    {

    int a = 3, b = 7;

    printf("%d %d\n", a, b);

    interschimba(&a, &b);

    printf("%d %d\n", a, b);

    }

    4

    void interschimba(int *p, int *q)

    {

    int tmp;tmp = *p;

    *p = *q;

    *q = tmp;

    }

    Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    5/20

    Regulipentrustabilireadomeniului

    Domeniulunuiidentificatoresteparteadintextulunuiprogramundeidentificatorulestecunoscut (sauaccesibil).

    Aceastaideedepindedenotiuneade"bloc",careesteoinstructiunecompusacudeclaratii (nCunastfeldeblocesteinclusntre{}).

    Reguladebazainstabilireadomeniuluiesteaceeacidentificatoriisuntaccesibilinumainbloculundesunt

    declaratisinecunoscutiinafaragranitelorblocului.

    5 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    6/20

    Regulipentrustabilireadomeniului{

    int a = 2;

    printf("%d\n", a);

    {

    int a = 7;

    printf("%d\n", a);

    }

    printf("%d\n", ++a);

    }

    6

    {

    int a_afara = 2;

    printf("%d\n", a_afara);

    {

    int a_inauntru = 7;printf("%d\n", a_inauntru);

    }

    printf("%d\n", ++a_afara);

    }

    Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    7/20

    Clasedememorare

    Orice variabila sau functie aredoua atribute:

    tipul si clasa dememorare

    Exista patru clase dememorare inC,

    automata,externa,registru si statica

    si sunt datedeurmatoarele cuvinte rezervate:

    auto extern register static

    Cea mai cunoscuta clasa dememorare este "auto".

    7 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    8/20

    Clasadememorareauto

    Variabilele declarate ninteriorul funciilor sunt implicitautomate.Deaceea,clasa autoeste cea mai cunoscut

    dintre toate.Dac oinstruciune compus (bloc)ncepe cudeclararea unor variabile,atunci aceste variabile sunt ndomeniu ntimpul execuieiacestei instruciuni compuse.

    Variabilele sunt implicitautomate. Laexecuie,cnd seintr ntrunastfeldebloc,sealoc

    memorie pentru variabilele automate.Variabilele sunt

    consideratelocaleacestui bloc.Cnd seiese dinacel bloc,sistemul elibereaz zona dememorie ocupat deacestea ideci valorile acestor variabile sepierd.

    8 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    9/20

    Clasadememorareextern

    O metoda de transmitere a informaiei n blocuri i funcii estefolosirea variabilelor externe. Dac o variabil este declarat

    n afara funciei, atunci acesteia i se aloca permanentmemorie i spunem c ea aparine clasei de memorare"extern".

    O variabil extern este considerat global tuturor

    funciilor declarate dup ea, si chiar dupa ieirea din blocuri

    sau funcii, ea rmne permanent n memorie.

    9 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    10/20

    Clasadememorareextern

    #include

    int a = 1, b = 2, c = 3;

    int f(void);

    void main()

    {

    printf("%d%d%d\n", a, b, c);

    printf("%d\n", f());printf("%d%d%d\n", a, b, c);

    }

    10

    int f(void)

    {

    int b, c; /* b si c sunt

    locale, deci b, c globale

    sunt mascate */

    a = b = c = 4; /*valoarea lui a se modifica

    */

    return(a + b +c);

    }

    Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    11/20

    Clasadememorareextern

    #include

    int a = 1, b = 2, c = 3;

    int f(void);

    void main()

    {

    printf("%d%d%d\n", a, b, c);

    printf("%d\n", f());printf("%d%d%d\n", a, b, c);

    }

    11

    int f(void)

    {

    int b, c; /* b si c sunt

    locale, deci b, c globale

    sunt mascate */

    a = b = c = 4; /*valoarea lui a se modifica

    */

    return(a + b +c);

    }

    Cuvntul rezervat "extern" spunecompilatorului "caut peste tot,chiar i n alte fiiere!".

    f i s ie r1 .c

    f i s ie r2 .c extern int a;

    Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    12/20

    Clasadememorareextern

    Putem conchide c informaiile sepottransmite prinvariabileglobale (declarate cuextern)sau folosind transmiterea

    parametrilor.Deobicei seprefer aldoilea procedeu. Toate funciile auclasa dememorare extern.Deexemplu,

    pentru definiiafunciei sin(),putem scrie:

    extern double sin(double x)

    {

    ...

    }

    12 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    13/20

    Clasadememorareregister

    Clasa dememorare "register"spune compilatorului cvariabilele asociate trebuie s fiememorate nregitridememorie devitez mare,dac aceasta este fizic i semanticposibil.Dac memorareanregistri este imposibil,clasa dememorare registerva fi nlocuit cuceaimplicit, "auto".Deobicei compilatorul aredoar civa astfel deregitri

    disponibili.Multisunt folositi desistem i deci nupotfialocati.

    Folosirea clasei dememorare "register"este oncercare dea

    mri viteza deexecuie aprogramelor.Deregul,variabileledintro bucl sau parametrii funciilor sedeclar detip"register".

    13 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    14/20

    Clasadememorarestatic

    Declaratiile "static"audou utilizri distincte i importante:

    Permit unei variabile locales rein vechea valoare cnd sereintr nbloc(sau funcie)(caracteristic ce este ncontrastcuvariabilele "auto"obinuite).

    Folosit ndeclaraiiexterne arealta comportare (vom discutanseciuneaurmatoare).

    14 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    15/20

    Clasadememorarestatic

    void f(void)

    {

    static int contor = 0;

    ++contor;

    }

    Primadat cnd funcia este apelat,contor seiniializeaz

    cu0.Cnd seprsete funcia,valoarea lui contor sepstreaz nmemorie.Laurmatorul apel f(), contor nuseva mai iniializa,ba mai mult,va avea valoarea caresa

    pastrat nmemorie laprecedentul apel.Declararea luicontor castatic nfunciaf()lpstreaz privat nf() (adic numai aici i sepoate modifica valoarea).

    15 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    16/20

    Variabileexternestatice

    Folosirealui"static"cadeclaraieextern puneladispoziieunmecanismde"izolare"foarteimportantpentrumodularitatea

    programelor.Prin"izolare"nelegemvizibilitateasaurestriciilededomeniu.

    Deosebireadintrevariabileexterniceleexternstatic estecacesteadinurm suntvariabileexternecurestriciidedomeniu.Domeniulestefiierulsurs ncareelesunt

    declarate.Astfel,acesteasuntinaccesibilepentrufunciiledefiniteanteriornfiiersaudefinitenaltefiiere,chiardacfunciilefolosescclasadememorare"extern".

    16 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    17/20

    Variabileexternestatice

    void f(void)

    {

    . . . . . /* v nu este accesibil aici */

    }

    static int v; /* variabila externa statica */

    void g(void)

    {. . . . . /* v poate fi folosit aici */

    }

    17 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    18/20

    Funciistatice

    Functiiledeclarate"static"suntvizibiledoarinfisierulundeaufostdeclarate.

    void f(int a)

    {

    . . . . . /* g() este disponibil aici, dar nu

    si in alte fisiere */}

    static int g(void)

    {

    . . . . .

    }

    18 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    19/20

    iruri ipoineri

    Un ir(semaispune ivector)esteosecven dedatececoninearticoledeacelaitip,indexate imemoratecontinuu.Deobicei, irurilesefolosescpentrureprezentareaunuinumarmaredevaloriomogene.

    Odeclaraieobinuit de iraloc memoriencepnddelaoadres debaz.

    Numele iruluiesteunpointerconstantlaaceast

    adres debaz.

    19 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]

  • 7/31/2019 Limbaj de programare C8

    20/20

    Iniializriimplicite

    InC,variabileleexterne istatice carenusuntexplicitiniializatedectreprogramator,suntiniializatedectre

    sistemcu0.Aceastainclude iruri, iruridecaractere,pointeri,structuri inregistrri(union).Pentru iruri(decaractere),aceastanseamn c fiecareelementseiniializeaz cu0,iar

    pentrustructuri i"union"fiecaremembruseiniializeaz totcu0.

    ncontrastcuacestea,variabileleregistru iauto nuse

    iniializeaz dectresistem,cipornesccuvalori"garbage"(adic cucesegsetelamomentulexecuieilaaceaadresa).

    20 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]