Sunteți pe pagina 1din 18

Limbaje deprogramare

Cursul XI

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

iruriuni dimensionale iruri unidimensionale


Pentru memorarea elementelor intrun sir, compilatorul rezerva un spatiu de memorie corespunzator, pornind de la o adresa de baza. Dimensiunea spatiului de memorie este egala cu numarul de elemente ale sirului inmultit cu numarul de octeti necesari memorarii unui element al sirului. #define N 5 int a[N]; Alocaspatiupentrua[0],a[1],a[2],a[3]sia[4] adica 5intregi x4 t ti i t 20 t ti x 4octetiperintreg=20octeti.
2 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Relatiadintrevectorisipointeri Relatia dintre vectori si pointeri


Aritmeticapointerilorpuneladispozitieoalternativa pentruindexareasirurilor. Instructiunilep = a + 1; sip = &a[1]; suntechivalentesivaasignalui"p"valoarea302(adresa, bineinteles). bineinteles) ; suma = 0; for (p = a; p < &a[N]; ++p) suma += *p; (adunaelementelesiruluia[])
3 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeriaritmetici Pointeri aritmetici


Pointeriiaritmeticireprezintaunadintrasaturile puternicealelimbajuluiC.Dacavariabila p este pointer puternice ale limbajului C. Daca variabila "p"estepointer catreuntipparticular,atunciexpresia"p+1"reprezinta adresamasinapentrumemorareaurmatoareivariabilede acesttip. Inmodsimilar,p + i ++ I d i il i, ++p, p + i ausens. += Daca"p"si"q"suntpointericatreelementedetipvector, Daca "p" si "q" sunt pointeri catre elemente de tip vector atunci"p q"intoarcevaloarea"int"sireprezinta numaruldeelementedintre"p"si"q". p q
4 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

iruricaargumentepentrufunctii iruri ca argumente pentru functii


Inantetul functiei precedente,declaratia: int a[]; este echivalenta cu int *a; cuint a; Pe dealta parte,declaratiile demai sus nusunt echivalente daca seutilizeaza inalta parte:
primasereferalacreeareaunuipointerconstant(faraspatiu dememorie); adouavacreaovariabilapointer.

Presupunemca"v"estedeclaratcafiindunsirde100de elementedetip"int".Dupaceamatribuitvalori elemente de tip "int" D pa e am atrib it alori elementelorsale,putemutilizafunctia"suma()"pentrua adunaanumitevalorialelui"v".


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

Siruribidimensionale Siruri bidimensionale


Presupunemcaavemunvector2dimensionalcu elementeintregi. elemente intregi.
int a[3][5];

Incepandcuadresadebaza,compilatorulvaalocaspatiu continuupentru15intregi.Atunciputemgandiacest vectorcaomatriceastfel:


col1 lin1 lin2 lin3 [ ][ ] a[0][0] a[1][0] a[2][0] col2 a[0][1] [ ][ ] a[1][1] a[2][1] col3 a[0][2] [ ][ ] a[1][2] a[2][2] col4 a[0][3] [ ][ ] a[1][3] a[2][3] col5 a[0][4] [ ][ ] a[1][4] a[2][4]

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

Alocareadinamicaamemoriei Alocarea dinamica a memoriei


Cpuneladispozitiepentrualocareamemorieifunctiile calloc() simalloc() din<stdlib.h>.Acestlucruva permiterezervareamemorieipentruunvector(deexemplu) caruiaiiaflamdimensiuneaabiaintimpulexecutiei(pana acumdeclaramdimensiuneaunuivectorcu#define in # codulsursa). calloc(n, dimensiune_tip) vareturnaunpointercatreunspatiudinmemorienecesar pentrumemorareaa"n"obiecte,fiecarepe"dimensiune_tip" octeti. Dacasistemulnupoatealocaspatiulcerut,atunciacestava returnavaloareaNULL.
7 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Alocareadinamicaamemoriei Alocarea dinamica a memoriei


InANSIC,exista tipul "size_t",dat ca"typedef"in<stdlib.h>. Deobicei,tipuleste"unsigned". , p g Definitiatipuluiestefolositainprototipurilefunctiilor "calloc()"si"malloc()":
void *calloc(size_t, size_t); void *malloc(size_t);

Deoarece pointerul returnat de aceste functii are tipul "void", deaceste aretipul void acesta poate fi asignat altor pointeri fara conversie explicita (vezi pointerlavoid). Octetiirezervatide"calloc()"suntautomatinitializaticu0,pe candceirezervaticu"malloc()"nusuntinitializati.
8 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Alocareadinamicaamemoriei Alocarea dinamica a memoriei


#include <stdio.h> #include <stdlib.h> void main() { int *a, i, n, suma = 0; printf("\n%s", "Dati numarul de elemente ale sirului: "); scanf("%d", &n); a = (int *)calloc(n, sizeof(int)); /*aloca spatiu pentru n intregi*/ for (i = 0; i < n; ++i) scanf("%d", &a[i]); for (i = 0; i < n; ++i) suma += a[i]; free(a); / /* eliberarea spatiului */ / printf("\n%s%7d\n%s%7d\n\n", "Numarul de elemente: ", n, "Suma elementelor : ", suma); }

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

Alocareadinamicaamemoriei Alocarea dinamica a memoriei


Prototipulfunctiei"free()"din<stdlib.h>sieste
void free(void *ptr); ( p )

Spatiulalocatde"calloc()"si"malloc()"ramaneocupatpana candesteeliberatdecatreprogramator.Acestanuse elibereazacandseiesedintrofunctie(incaresafacut rezervareadememorie). Inprogramuldemaisus,instructiunea In programul de mai sus instructiunea


a = calloc(n, sizeof(int));

esteechivalentacu este echivalenta cu


a = malloc(n * sizeof(int));

Singuradiferentaesteinitializareacu0la"calloc()".
10 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Siruridecaracteresipointeri Siruri de caractere si pointeri


Uncaracterdintrunsirdecaracterea poatefiaccesat folosindindexulsirului(a[i],deexemplu)saufolosind ( [ ], p ) pointerilacaracter. Princonventie,unsirdecaractereseterminaprinmarcatorul \0,saucaracterulnul.Deexemplu,sirul"abc"este memoratpe4caractere,ultimulfiindOBLIGATORIU\0.Deci memorat pe 4 caractere ltim l fiind OBLIGATORIU \0 Deci numaruldeelementealsiruluieste3,iardimensiunea4.

11

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

Siruridecaracteresipointeri Siruri de caractere si pointeri


charw[100]; Initializarea(citirea)unuisirsepoatefaceinmaimulte moduri:
1.

Initializareafiecaruielementcucateuncaracter: w[0]='A'; w[1]='B'; w[2]='C'; w[3]='\0';


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

Siruridecaracteresipointeri Siruri de caractere si pointeri


2.

Folosindfunctia"scanf()": scanf( %s , scanf("%s", w); Formatul"%s" estefolositpentrucitireaunuisirde g p caractere.Distingemtreipasi:


pozitionarepeprimulcaracteralsirului; secitesctoatecaracterelediferitede<Enter>siseintroducin"w"; citireasefacepanacandintalnimEOF;acumseplaseazalasfarsitul sirului'\0'.

Dinmomentcenumeleunuisiresteunpointerlaadresade Din moment ce numele unui sir este un pointer la adresa de bazaasirului,expresia"w"esteechivalentacu"&w[0]".

13

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

Siruridecaracteresipointeri Siruri de caractere si pointeri


Atentie! 'a' si"a" suntdiferite.Primaesteo , constantacaracter,iaradouaesteoconstantasirde caractere. "a" = 'a' + '\0'
3.

Sirurilesepotinitializalafelcasicaracterele char s[] = "abc"; sau,echivalent char s[] = {'a', 'b', 'c', '\0'};

14

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

Bibliotecastandard string.h Biblioteca standard <string.h>


Biblioteca standard <string.h> contine multe functii utile p pentru lucrul cu siruri de caractere. Sirurile ce sunt argumente g trebuie terminate cu '\0' si toate returneaza un intreg sau o valoare a unui pointer catre "char". char*strcat(char*s1,constchar*s2); Functiaprimestedouaargumente,leconcateneazasipune rezultatulin"s1".Programatorultrebuiesaverificedaca"s1" aresuficientspatiupentrupastrarearezultatului.Se are suficient spatiu pentru pastrarea rezultatului Se returneazasirul"s1".

15

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

Bibliotecastandard string.h Biblioteca standard <string.h>


intstrcmp(constchar*s1,constchar*s2); Sunttrimisedouasiruridecaracteresisereturneazaunintreg g careestemaimicstrict,egalsaumaimarestrictdecat0dupa cumeste"s1"fatade"s2"(lexicografic) char*strcpy(char*s1,constchar*s2); char *strcpy(char *s1 const char *s2); Sirul"s2"estecopiatin"s1"panacandseintalneste'\0'.Ceea cesegasestein"s1"sesuprascrie.Sepresupuneca"s1"are g p p p suficientspatiupentrupastrarearezultatului. unsignedstrlen(constchar*s); Numaruldecaractereinaintealui'\0'. N ld i i l i '\0'

16

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

Bibliotecastandard string.h Biblioteca standard <string.h>


AcestefunctiisuntscriseinCsisuntfoartescurte.Variabilele dinelesuntdeobiceideclarate"register"pentruaface executiamairapida. executia mai rapida Deexemplu: unsigned strlen(const char *s) { register i t n = 0 i t int 0; for ( ; *s != '\0'; ++s) ++n; return n; }
17 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Bibliotecastandard string.h Biblioteca standard <string.h>


Undeestegreseala? Unde este greseala?

char s[14]; py( , ); strcpy(s, "Ce mai faci ?\n");

18

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