Documente Academic
Documente Profesional
Documente Cultură
ATP - Curs 1-Pointeri Si Alocare Dinamica
ATP - Curs 1-Pointeri Si Alocare Dinamica
ATP - Curs 1-Pointeri Si Alocare Dinamica
de programare
-curs 1-
Informatii generale
Punctaj:
5p examen (C)
3p lucrare la seminar ( S)
1p activitate seminar (S)
1p din oficiu
2.
3.
4.
5.
6.
7.
8.
Introducere
Operatori specifici
Declarare i iniializare
Operaii cu pointeri
Legtura dintre pointeri i masive
Alocarea dinamic a memoriei
Modificatorul const
Alocarea dinamic a masivelor
1. Introducere
talouri
transfer al parametrilor functiilor
acces direct la memorie
alocare dinamica a memoriei.
2.
Operatori specifici
Nume
Simbol
Rol
Utilizare
Operator de
refereniere
Definirea de tipuri de
dat pointer
tip*
void*
Operator de
refereniere
&
&nume
Operator de
derefereniere
Acceseaz coninutul
zonei de memorie
indicat de un pointer
*nume
3. Declarare i iniializare
Declarare pointer: tip * variabila_pointer;
tip tipul de baza al pointerului si care indica tipul datelor memorate la adresa
continuta in variabila_pointer
Ex:
int * p;
char * s;
p - pointer cu tipul de baza int => contine adresa unei zone de memorie la care este
memorat un numar intreg (de tip int).
s pointer cu tipul de baza char => contine adresa unei zone de memorie la care este
memorat un caracter.
Atentie:
De exp. :
p = &a;
q = p;
*q = 7;
void* p;
Pointeri - exemple
int* nume; int a; float b;
nume=&a;
nume=&b; //eroare, De ce?
Atribuire
Operatorul de atribuire =
int *p, *q; float *r, *s;
p = q;
r = s;
p = r; s = q; //eroare
int *q; void *r;
r=q;
q=(int*)r;
10
4. Operaii cu pointeri
float v[20]; float *p; p=v;
Incrementare/decrementare
p++; p--;
Adunarea/scderea unui ntreg
p=v+5; p=p-2;
Compararea a doi vectori
p?v (==, !=, >, <, >=, <=) //NULL
Diferena dintre doi pointeri
p-v;
11
Numele unui tablou este un pointer constant care are ca valoare adresa
primului element din tablou.
Forma 1
v
v+i
*v
*(v+i)
*(v+1)
Forma 2
&v[0]
&v[i]
v[0]
v[i]
v[1]
Comentariu
Adresa primului element din vector
Adresa elementului de pe pozitia i din vector
Primul element din vector
Elementul de pe pozitia i din vector
Elementul de pe prima pozitie
12
Forma 1
Forma 2
mat
&mat[0]
mat+i
* mat
mat [0]
&mat[0][0]
*(mat+i)
mat [i]
&mat[i][0]
mat[i][j]
*(*(mat+i)+j)
Forma 3
Comentariu
13
Se include
malloc.h (Visual C)
Funcii importante
Alte funcii
14
7. Modificatorul const
Pointer constant
tip *const nume;
Exemplu: char *const p=Limbajul C;
p++; --p; //???
Pointer la o zon de memorie constant
tip const *nume;
Exemplu: char const *p=Limbajul C;
*p=J; //???
15
Exemple:
1. Interpretai urmtoarele expresii:
a) *++p;
b) *p++;
c) (*p)++;
d) --*p;
e) ++*--p;
16
Rspuns:
*++p; //preincrementeaza pointerul si apoi extrage continutul
b) *p++; extrage continutul, apoi postincrementare de pointer
c) (*p)++; extrage continutul, apoi postincrementare continut
d) --*p; predecrementare continut
e) ++*--p; predecrementare de adresa si incrementarea continutului
de la noua adresa
a)
17
18
int m,n,i,j;
19
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{printf("a[%d][%d]=",i,j);
scanf("%f", &a[i][j]);//scanf("%f", *(a+i)+j);
}
//alocare vector
min=(float*)malloc(m*sizeof(float));
for(i=0;i<m;i++)
{ min[i]=a[i][0];
for(j=1;j<n;j++)
if(a[i][j]<min[i])min[i]=a[i][j];}
for(i=0;i<m;i++) printf("%4.2f,", min[i]);
//eliberare memorie
free(min);
for(i=0;i<m;i++) free(a[i]);
free (a);
}
20
Transferul masivelor
static
n apelator
dinamic
n apelator
static
n apelator
I/
Masiv
/E
n apelator
dinamic
n subprogram
21
Transferul vectorilor
I/ : v[10], n
/E: void sortare( int a[10], int n )
{
a[i]
}
22
Exemplu 1
S se calculeze produsul scalar dintre doi vectori
Rezultatul se ntoarce prin numele funciei
float ps(float x[], float y[], int n)
{ int i;
float prod=0;
for(i=0;i<n;i++) prod+=x[i]*y[i];
return prod;}
void main()
{ float a[30], b[30]; int dim;
23
Exemplu 1 cont.
void main()
{ float a[30], b[30]; int dim;
.
float rez;
ps(a,b,dim,&rez);
printf("produsul scalar este %5.2f", rez);
}
24
Exemplu 2
25
Exemplu 2 - cont.
26
Exemplu 2 - cont.
Toate masivele
alocate dinamic n
apelator
int *alocareV (int n)
{ int *p,i;
p=(int*)malloc(n*sizeof(int));
return p; }
void main()
{
v1=alocareV(m);
v2=alocareV(m);
citireV(v1,m);
citireV(v2,m);
vR=alocareV(m);
prodVect(v2,v2,m,vR);
afisareV(vR,m);
free (v1);
free(v2);
}
Transferul matricelor
I/ : a[10][10], m, n
/E: -
28
Exemple
29
int i,j,k;
for (i=0;i<m;i++)
for(j=0;j<p;j++)
{c[i][j]=0; for (k=0;k<n;k++) c[i][j]+=a[i][k]*b[k][j];}
}
void main()
{
produs(a,b,m,n,p,c);
//afisare elemente matrice c
}
30