Sunteți pe pagina 1din 20

Limbaje deprogramare

Cursul VIII

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

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 adresele variabilelor caargumente napelul funciei.

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
Dac v este ovariabil,atunci &v este adresa (sau locaia) ei nmemorie.Operatorul deadres & este unar i are aceeai preceden i asociativitate caceilali operatori unari. Operatorul deindirectare (sau dederefereniere)*se aplic unui pointeri returneaz valoarea scris n memorie laadresa dat depointer.

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Apelprinreferin
#include <stdio.h> 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); } void interschimba(int *p, int *q) { int tmp; tmp = *p; *p = *q; *q = tmp; }

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Regulipentrustabilireadomeniului
Domeniulunuiidentificatoresteparteadintextulunui programundeidentificatorulestecunoscut (sauaccesibil). Aceastaideedepindedenotiuneade"bloc",careesteo instructiunecompusacudeclaratii (nCunastfeldebloc esteinclusntre{}). Reguladebazainstabilireadomeniuluiesteaceeac identificatoriisuntaccesibilinumainbloculundesunt declaratisinecunoscutiinafaragranitelorblocului.

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Regulipentrustabilireadomeniului
{ int a = 2; printf("%d\n", a); { int a = 7; printf("%d\n", a); } printf("%d\n", ++a); } { int a_afara = 2; printf("%d\n", a_afara); { int a_inauntru = 7; printf("%d\n", a_inauntru); } printf("%d\n", ++a_afara); }
6 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

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: autoexternregisterstatic Cea mai cunoscuta clasa dememorare este "auto".
7 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Clasadememorareauto
Variabilele declarate ninteriorul funciilor sunt implicit automate.Deaceea,clasa autoeste cea mai cunoscut dintre toate.Dac oinstruciune compus (bloc)ncepe cu declararea unor variabile,atunci aceste variabile sunt n domeniu 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 i deci valorile acestor variabile sepierd.
8 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Clasadememorareextern
O metoda de transmitere a informaiei n blocuri i funcii este folosirea variabilelor externe. Dac o variabil este declarat n afara funciei, atunci acesteia i se aloca permanent memorie 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.

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Clasadememorareextern
#include <stdio.h> 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); } 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); }

10

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Clasadememorareextern
#include <stdio.h> 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); } fisier1.c Cuvntul rezervat "extern" spune compilatorului "caut peste tot, chiar i n alte fiiere!".
11

fisier2.c extern int a; 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 LSTOLER@UAIC.RO

Clasadememorareextern
Putem conchide c informaiile sepottransmite prinvariabile globale (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 LSTOLER@UAIC.RO

Clasadememorareregister
Clasa dememorare "register"spune compilatorului c variabilele asociate trebuie s fiememorate nregitride memorie devitez mare,dac aceasta este fizic i semantic posibil.Dac memorareanregistri este imposibil,clasa de memorare registerva fi nlocuit cuceaimplicit, "auto".De obicei compilatorul aredoar civa astfel deregitri disponibili.Multisunt folositi desistem i deci nupotfi alocati. Folosirea clasei dememorare "register"este oncercare dea mri viteza deexecuie aprogramelor.Deregul,variabilele dintro bucl sau parametrii funciilor sedeclar detip "register".
13 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Clasadememorarestatic
Declaratiile "static"audou utilizri distincte i importante: Permit unei variabile locales rein vechea valoare cnd se reintr nbloc(sau funcie)(caracteristic ce este ncontrast cuvariabilele "auto"obinuite). Folosit ndeclaraiiexterne arealta comportare (vom discuta nseciuneaurmatoare).

14

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Clasadememorarestatic
void f(void) { static int contor = 0; ++contor; }

Primadat cnd funcia este apelat,contor seiniializeaz cu0.Cnd seprsete funcia,valoarea lui contor se pstreaz nmemorie.Laurmatorul apel f(), contor nu seva mai iniializa,ba mai mult,va avea valoarea caresa pastrat nmemorie laprecedentul apel.Declararea lui contor castatic nfunciaf() lpstreaz privat n f() (adic numai aici i sepoate modifica valoarea).
15 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Variabileexternestatice
Folosirealui"static"cadeclaraieexternpuneladispoziieun mecanismde"izolare"foarteimportantpentrumodularitatea programelor.Prin"izolare"nelegemvizibilitateasau restriciilededomeniu. Deosebireadintrevariabileexterniceleexternstatic estec acesteadinurm suntvariabileexternecurestriciide domeniu.Domeniulestefiierulsurs ncareelesunt declarate.Astfel,acesteasuntinaccesibilepentrufunciile definiteanteriornfiiersaudefinitenaltefiiere,chiardac funciilefolosescclasadememorare"extern".
16 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Variabileexternestatice
void f(void) { . . . . . } static int v;

/* v nu este accesibil aici */

/* variabila externa statica */

void g(void) { . . . . . }

/* v poate fi folosit aici */

17

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Funciistatice
Functiiledeclarate"static"suntvizibiledoarinfisierulundeau fostdeclarate.
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 LSTOLER@UAIC.RO

iruriipoineri
Unir(semaispuneivector)esteosecven dedatece coninearticoledeacelaitip,indexateimemorate continuu.Deobicei,irurilesefolosescpentru reprezentareaunuinumarmaredevaloriomogene. Odeclaraieobinuit deiraloc memoriencepndde laoadres debaz. Numeleiruluiesteunpointerconstantlaaceast adres debaz.

19

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Iniializriimplicite
InC,variabileleexterne istatice carenusuntexplicit iniializatedectreprogramator,suntiniializatedectre sistemcu0.Aceastaincludeiruri,iruridecaractere,pointeri, structuriinregistrri(union).Pentruiruri(decaractere), aceastanseamn c fiecareelementseiniializeaz cu0,iar pentrustructurii"union"fiecaremembruseiniializeaz tot cu0. ncontrastcuacestea,variabileleregistru iauto nuse iniializeaz dectresistem,cipornesccuvalori"garbage" (adic cucesegsetelamomentulexecuieilaaceaadresa).

20

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

S-ar putea să vă placă și