Académique Documents
Professionnel Documents
Culture Documents
I. Structuri
Practic hardware
Tipul struct
colec ie de variabile (membri)
accesate printr-un nume comun
Practic hardware
Reprezentare intern
membrii sunt plasa i n memorie unul dup altul la adrese consecutive
adresa de nceput a primului membru = adresa de nceput a structurii adresa de nceput a fiec rui membru = suma dimensiunilor membrilor preceden i
sau nu?
3
Practic hardware
Exemplu
struct S { char a,b; int c; double d; char e; short f; };
4
Practic hardware
Exemplu (cont.)
S s; printf("Dimensiune structura: %d\n",sizeof(s)); printf("start:\t%p\n",&s); printf("a:\t%p\t%2d\n",&s.a,(int)&s.a-(int)&s); printf("b:\t%p\t%2d\n",&s.b,(int)&s.b-(int)&s); printf("c:\t%p\t%2d\n",&s.c,(int)&s.c-(int)&s); printf("d:\t%p\t%2d\n",&s.d,(int)&s.d-(int)&s); printf("e:\t%p\t%2d\n",&s.e,(int)&s.e-(int)&s); printf("f:\t%p\t%2d\n",&s.f,(int)&s.f-(int)&s);
5
Practic hardware
Practic hardware
Interpretare
variabila c ncepe la deplasament 4
n loc de 2
dimensiunea structurii - 24
ar fi trebuit s fie 17 sau 20, dac inem cont de cele de mai sus
7
Practic hardware
Practic hardware
alinierea poate fi dezactivat Project p Properties p C/C++ p Code Generation p Struct Member Alignment: 1 Byte (n loc de Default)
9
Practic hardware
10
Practic hardware
Practic hardware
De ce ne intereseaz ?
calculul adreselor elementelor din tablourile de structuri
vezi anterior
Practic hardware
Practic hardware
Citire header
bmpfile_header_t bh; FILE *fBMP=fopen("f.bmp","r"); // citire header fisier fread(&bh,sizeof(bh),1,fBMP); // ... fclose(fBMP);
14
Practic hardware
Probleme
sizeof(bh)=16 n fi ier nu exist aliniere trebuie citi i 14 octe i deplasamentele cmpurilor sunt la rndul lor incorecte e mai sigur s citim membrii unul cte unul
15
Practic hardware
accesarea membrilor
pe stiv avem doar un pointer, nu toat structura aten ie la aliniere
16
Practic hardware
Practic hardware
structuri
nu pot fi returnate n limbajul C
doar pointeri la structuri
Practic hardware
Solu ii (1)
depinde de compilator
aici discut m despre Visual Studio
Practic hardware
Solu ii (2)
structur cu dimensiune mai mare de 8 octe i
se mai transmite un parametru ascuns (nu apare n lista de parametri) adresa structurii care trebuie completat cu rezultatul acest parametru este plasat la adresa [ebp+8] deci primul parametru "real" se g se te acum la [ebp+12]
20
Practic hardware
Practic hardware
Ce este o referin
nu apare n limbajul C introdus n C++ reprezint un alt nume (alias) pentru o variabil deja existent
22
Practic hardware
Declarare
int a; int &b=a; b este o referin pentru a a nu se confunda cu operatorul adres moduri incorecte de declarare: int &b; int &b=20;
23
Practic hardware
Utilizare
int a; int &b=a; a=3; b=5; printf("%d\n",a); rezultat afi at: 5 deci a fost modificat chiar variabila a
24
Practic hardware
25
Practic hardware
Practic hardware
Practic hardware
compilatorul ascunde aceste detalii se dore te s privim b ca pe un alt nume pentru a putem verifica prin afi area adreselor variabilelor a i b
28
Practic hardware
rezultat afi are 0012FF60 0012FF60 deci C++ raporteaz aceea i adres
29
Practic hardware
30
Practic hardware
Utilitate (1)
referin ele sunt deci pointeri avantaj - mai u or de lucrat dect cu pointerii
nu mai trebuie s folosim operatorii & (adres ) i * (dereferen iere) p mai pu ine gre eli
Practic hardware
Utilitate (2)
referin ele nu pot deci nlocui pointerii n toate situa iile
exemplu - parcurgerea elementelor unui tablou
char s[]="abcd",*p; for(p=s;*p!='\0';p++) // ... unde sunt totu i utile? cel mai des folosite - parametri pentru func ii
32
Practic hardware
Practic hardware
Practic hardware
n unele situa ii putem folosi doar pointeri cum stau lucrurile la nivelul limbajului de asamblare?
nici o diferen ntre referin e i pointeri
35
Practic hardware
Practic hardware
Pointeri dubli
un pointer con ine adresa unei variabile aceast variabil poate fi la rndul s u un pointer
.a.m.d. (foarte rar)
Practic hardware
Exemplu
o func ie pentru inserarea unui element ntro list nl n uit parametru - capul listei ce tip are?
pointer dar dac elementul trebuie inserat nainte de primul din list ? modific m capul listei - ne trebuie adresa sa
38
Practic hardware