Documente Academic
Documente Profesional
Documente Cultură
Cursul VIII
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.
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.
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; }
Regulipentrustabilireadomeniului
Domeniulunuiidentificatoresteparteadintextulunui programundeidentificatorulestecunoscut (sauaccesibil). Aceastaideedepindedenotiuneade"bloc",careesteo instructiunecompusacudeclaratii (nCunastfeldebloc esteinclusntre{}). Reguladebazainstabilireadomeniuluiesteaceeac identificatoriisuntaccesibilinumainbloculundesunt declaratisinecunoscutiinafaragranitelorblocului.
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.
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
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); }
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
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;
void g(void) { . . . . . }
17
Funciistatice
Functiiledeclarate"static"suntvizibiledoarinfisierulundeau fostdeclarate.
void f(int a) { . . . . . /* g() este disponibil aici, dar nu si in alte fisiere */ } static int g(void) { . . . . . }
18
iruriipoineri
Unir(semaispuneivector)esteosecven dedatece coninearticoledeacelaitip,indexateimemorate continuu.Deobicei,irurilesefolosescpentru reprezentareaunuinumarmaredevaloriomogene. Odeclaraieobinuit deiraloc memoriencepndde laoadres debaz. Numeleiruluiesteunpointerconstantlaaceast adres debaz.
19
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