Sunteți pe pagina 1din 13

Tehnici de programare

Alocarea dinamic a memoriei. Pointeri

ovidiu.banias@aut.upt.ro

Cuprins

Memoria. Adrese Variabile de tip pointer Operatorii de adresare i derefereniere Alocarea dinamic a memoriei Vectori i pointeri

Memoria
Segmentul de STIV
Variabile locale Apeluri de funcii Variabile globale, statice Alocare dinamic Variabile iniializate/neiniializate BSS= block starting with symbol

Heap Segmentul de DATE BSS Date

Segmentul de COD/TEXT

Conine instruciunile executabile

Reprezentarea ntregilor

Adrese de memorie
Adres = numrul de ordine al unui octet(cuvnt) n memorie Compilator pe 16/32 de bii O variabil ocup x octei succesivi. Adresa primului octet=adresa variabilei
char 1 octet int 2 octei (sau 4) adresa unei variabile valoarea variabilei adres = pointer
Reprezentarea ntregilor

Variabile de tip pointer


Sintaxa C: tip *numeVar
tip : tip de dat standard (char, int,)
sau tip de dat compus(struct, union,..)

tip char int

*numeVar *adresa1; *adresa2, *adresa3;

* : operator de derefereniere (indirectare) float *adresa4; numeVar : nume variabil

Pointer = variabil ce are ca valoare o adres de memorie O variabil de tip pointer, pointeaz ctre o anumit zon din memorie (adreseaz o anumit zon de memorie)

Variabile de tip pointer


int v=7; int *vPtr; vPtr=&v;
Pointerul vPtr pointeaz ctre variabila v

v
9
& - operator de adresare (refereniere) 0, NULL iniializare pointer Refereniere direct

vPtr

v
9
Refereniere indirect

Variabile de tip pointer. Derefereniere


int v=9; int *vPtr; int main() { printf("%p\n",vPtr); vPtr=&v; printf("%d\n",*vPtr); printf("%p\n",vPtr); printf("%p\n",&v); return 0; } &v adresa de memorie la care este stocat valoarea variabilei v & operator de adresare *vPtr valoarea stocat la adresa de memorie spre care pointeaz vPtr. * operator de derefereniere * operator de indirectare %p specificator de formatare adres de memorie

iniializare variabil pointer

Operaii cu pointeri. Exemplificare


int v=9; int *vPtr, *vPtr2; int main() { vPtr=&v; *vPtr = *vPtr + 5; printf("%d\n",*vPtr); (*vPtr) ++; printf("%d\n",*vPtr); vPtr2=vPtr; (*vPtr) ++; printf("%d\n",*vPtr2); printf("%p\n",vPtr); printf("%p\n",vPtr2); return 0; }

Alocarea dinamic
#include <stdio.h> #include <stdlib.h> #define tip char tip *vPtr, *vPtr2; int main() { vPtr=(tip *) malloc(sizeof(tip)); vPtr2=(tip *) malloc(sizeof(tip)); printf("%p\n",vPtr); printf("%p\n",vPtr2); printf("%p\n",vPtr2+1); printf("%d\n",(vPtr2-vPtr)); return 0; }

Reprezentarea ntregilor

Transmiterea parametrilor prin referin


void Swap1(int p, int q){ // prin valoare int k; k=p;p=q;q=k; } void Swap2(int &p, int &q){ // prin referinta (C++) int k; k=p;p=q;q=k; } void Swap3(int *p, int *q){ // prin referinta int k; k=*p;*p=*q;*q=k; } int main() { a=2;b=5; Swap1(a,b);printf("Swap1 -> %d %d\n",a,b); Swap2(a,b);printf("Swap2 -> %d %d\n",a,b); Swap3(&a,&b);printf("Swap3 -> %d %d\n",a,b); return 0; } Reprezentarea ntregilor

Vectori i pointeri
Strns legtur ntre vectori i pointeri Orice operaie cu indici i vectori poate fi realizat cu pointeri

v[0] v[1] v[2]


int v[8];

v[i]

v[7]

v:
p:
v[1] ? *(p+1) ? (v[i]== *(p+i)) ?

int *p; p=&a[0];

Reprezentarea ntregilor

Vectori (iruri de caractere) i pointeri


char m[]=hello world!; //vector

char *m=hello world!; //pointer

m:
+ strcpy, strcmp, strcat, strlen, + studiu bibliografic

Reprezentarea ntregilor

Vectori multidimensionali i pointeri


char a[3][10]={Luni,Marti,Miercuri};

SAU
char *a[3]={Luni,Marti,Miercuri};

+ avantaje + dezavantaje + exemplificare

Reprezentarea ntregilor

S-ar putea să vă placă și