Documente Academic
Documente Profesional
Documente Cultură
L11-Pointeri Si Alocare Dinamica
L11-Pointeri Si Alocare Dinamica
// citm pe a
scanf(%d,&b);
// citim pe b
interschimb(&a,&b);
// apelam functia care interschimba valorile
variabilelor a si b ; &a si &b sunt parametri actuali ai functiei
printf(a=%d, b=%d, a, b);
// observam ca a si b sunt interschimbate
}
Atenie!!! S nu cdei n extrema de a folosi pointeri tot timpul. O greeal frecvent care poate s
apar este urmtoare:
void interschimb(int *adresa_a, int *adresa_b)
{
int *aux;
*aux= *adresa_a;
*adresa _a = *adresa _b;
*adresa _b =*aux;
}
Greeala este ca *aux nu exist, doar aux; deci este total greit. n aux se
afl o valoare aleatoare; prin *aux noi mergem la acea adres aleatoare, care ar
putea fi o adres la care noi nu avem acces, sau chiar adresa unei variabile din
program pe care astfel o modificm fr s fim contieni.
Un caz aparte l reprezint tablourile. Numele unei variabile tablou reprezint de fapt adresa de
nceput a variabilei. Deci cnd vom transmite ca parametru un tablou, vom transmite de fapt adresa
tabloului, care se va copia local pe stiv. Orice acces la elementele tabloului se va face direct pe
tabloul dat ca parametru, ntruct local se copiz adresa tabloului i nu tot tabloul. Deci dac vom
dori s modificm ntr-o funcie elementele unui tablou, vom da ca parametru tabloul.
tab[i]=i;
*(tab+i)=i;
destul de uor de apreciat, limitat de capacitatea fizic a celei mai mari sli de seminar). ntr-un
asemenea caz, vom declara variabilele n mod static, ca i pn acum. Dar pentru anumite
probleme, unde numrul de elemente al unui tablou poate s fie foarte diferit de la o rulare la alta,
putem s alocm memorie pentru elementele tabloului n timp ce programul rulez, cnd putem afla
de la utilizator cte elemente dorete s aib tabloul. Ceea ce nseamn c vom ocupa exact atta
memorie ct avem nevoie.
Singurul element sintactic de noutatea l constituie folosire funciei:
Funcia calloc este intuitiv folosit pentru tablouri unidimensionale, sau dac vrem s iniializm
memoria cu 0. O funcie pentru alocare dinamic mai general este
Probleme
Problemele vor fi date la laborator, n mod diferit de la o grup la alta.
Pentru exerciiu:
1. S se impelmenteze funcia strdup, conform specificaiilor (folosii help-ul ca s vedei ce ar
trebui s fac funcia strdup)
2. Citii i afiai o matrice NxM alocat dinamic. Matricea o vom memora ca pe un tablou
obinuit. Accesul la elementul a[i][j] nu se va mai putea face astfel ci a[i*M+j]. Practic
trebuie s calculm al ctelea element din tablou este i s scriem formula corespunztoare.
3. S se impelmenteze funcia strdup, conform specificaiilor (folosii help-ul ca s vedei ce ar
trebui s fac funcia strdup). Parcurgerea irurilor se va face cu variabile de tip pointer.
4. Scriei o funcie care primete 2 iruri ca parametru (sir_sursa si sir_elimin) i creaz un al
treilea ir care va fi de fapt irul sir_sursa din care s-au ters toate apariiile irului
sir_elimin. Noul ir va fi alocat dinamic (astfel nct s ocupe exact atta memorie ct e
necesar) i va fi returnat de ctre funcie.