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]