ATP - Curs 1-Pointeri Si Alocare Dinamica

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

Sunteți pe pagina 1din 33

Algoritmi si tehnici

de programare
-curs 1-

Informatii generale

As. dr. Radu Mogos


mogos.radu@gmail.com

Punctaj:

5p examen (C)
3p lucrare la seminar ( S)
1p activitate seminar (S)
1p din oficiu

Tipuri dinamice de date. Pointeri


1.

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

Lucrul cu pointeri - unul dintre atuurile limbajului C/C++

Folositi de obicei in lucrul cu:

talouri
transfer al parametrilor functiilor
acces direct la memorie
alocare dinamica a memoriei.

Pointeri de date pointeri care contin adresa zonei de


memorie a unei variabile.

2.

Operatori specifici
Nume

Simbol

Rol

Utilizare

Operator de
refereniere

Definirea de tipuri de
dat pointer

tip*
void*

Operator de
refereniere

&

Extrage adresa unei


variabile

&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.

pointer generic - un pointer cu tipul de baza void (void *).

NULL constanta pointer speciala, reprezinta faptul ca pointerul nu contine adresa


nici unei zone de memorie.Valoarea acestei constante este 0.

Atentie:

precizarea tipului de baza al pointerului este necesara.


adresa unei zone de memorie este de fapt adresa de baza a
primului octet din zona respectiva (o valoare numerica).

Indicand tipul de baza al pointerului, se poate determina,


in primul rand, dimensiunea zonei de memorie a carei
adresa este memorata in pointer.

De exp. :

2 octeti pentru int*


1 octet pentru char*
4 octeti pentru long int*

short int *p, a, *q;

p = &a;

q = p;

short int *p; short int a; short int *q;

*q = 7;

struct punct {float x,y;}* x; //sizeof (x) =4; sizeof(punct)=8

void* p;

Pointeri - exemple
int* nume; int a; float b;
nume=&a;
nume=&b; //eroare, De ce?

void *nume; int a; float b;


nume=&a; nume=&b;

int a, b, c; int *nume1; void *nume2;


b=5; nume1=&a; *nume1=b; c=*nume1+b; nume2=&b;
*nume2=10; //eroare - *(int *)nume2=10; //corect
c=*nume2; //eroare - c=*(int *)nume2; //corect

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

5. Legtura dintre pointeri i masive

Numele unui tablou este un pointer constant care are ca valoare adresa
primului element din tablou.

Vectori pentru tip v[LungMax];, avem expresiile care sunt echivalente:

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

Matrice o matrice este un vector de vectori, numele sau este un pointer la


prima linie din matrice pentru tip mat[LungMax][Lungmax];, avem expresiile
care sunt echivalente:

12

Forma 1

Forma 2

mat

&mat[0]

Adresa primei linii din matrice

mat+i

& mat [i]

Adresa liniei i din matrice

* mat

mat [0]

&mat[0][0]

Adresa primului element de pe linia 0

*(mat+i)

mat [i]

&mat[i][0]

Adresa primului element de pe linia i

mat[i][j]

Elementul de pe pozitia i si coloana j

*(*(mat+i)+j)

Forma 3

Comentariu

5. Legtura dintre pointeri i masive


vectori
int a[10]; int *p;
p = a; p=a+6;
a = p; //??
matrice
int a[5][5]; int **p;
p = a; //??

13

6. Alocarea dinamic a memoriei

Se include
malloc.h (Visual C)

Funcii importante

void* malloc(unsigned n);


void free(void* p);

Alte funcii

14

void* calloc(unsigned nr_elem, unsigned dim_elem);


void* farmalloc(unsigned long n);
void farfree(void* p);

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)

Not: *, ++, -- au aceeai prioritate i se asociaz de la


dreapta spre stnga

17

8. Alocarea dinamic a masivelor (1)


Exemple: alocare vector, matrice, comp. static-dinamic
1. Produs vectorial a doi vectori (fara functii)
2. Suma a doua matrice (fara functii)

18

8. Alocarea dinamic a masivelor (2)


Exemplu
S se scrie programul care determin minimul elementelor
de pe fiecare linie dintr-o matrice. Masivele se vor
aloca dinamic.
#include<stdio.h>
#include<malloc.h>
void main()
{ float **a, *min;

int m,n,i,j;

printf ("m="); scanf("%d", &m);


printf ("n="); scanf("%d", &n);
//alocare matrice
a=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++)
a[i]=(float*)malloc (n*sizeof(float));

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;

printf("produsul scalar este %5.2f", ps(a,b,dim));


}

23

Exemplu 1 cont.

Rezultatul se ntoarce prin parametru

void ps(float x[], float y[], int n, float *prod)


{ int i; *prod=0;
for(i=0;i<n;i++) *prod+=x[i]*y[i];
}

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

Produs vectorial ntre doi vectori

25

Toate masivele alocate static


Toate masivele alocate dinamic n apelator
Toate masivele alocate dinamic, rezultatul alocat n subprogram Tema

Exemplu 2 - cont.

Toate masivele alocate static

void ProdusVect (int p[10], int q[10], int n, int pv[10])


{ int i;
for (i=0;i<n;i++)
pv[i]=p[i]*q[i];
}

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 prodVect(int *p1, int *p2, int m, int


*pRez)
{ int i;
for(i=0;i<m;i++)
*(pRez+i)=*(p1+i)* *(p2+i);
}
27

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: -

Matrice alocat static

void min( int a[][10], int m, int n )


{
a[i][j]
Matrice alocat dinamic
}
void min( int **a, int m, int n )
{
a[i][j]
}

28

Exemple

Produsul dintre 2 matrice

29

Toate masivele alocate static


Toate masivele alocate dinamic n apelator
Toate masivele alocate dinamic, rezultatul alocat n subprogram
si intors prin parametru
Toate masivele alocate dinamic, rezultatul alocat n subprogram
si intors prin numele funciei

Exemplu alocare static


#include<stdio.h>
#include<malloc.h>
void produs(float a[][10], float b[][7], int m, int n, int p, float c[][7])
{

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()
{

float a[9][10], b[10][7], c[9][7]; int m,n,p,i,j;


printf ("m="); scanf("%d", &m); printf ("n="); scanf("%d", &n);
printf ("p="); scanf("%d", &p);
//citire elemente matrice a si matrice b

produs(a,b,m,n,p,c);
//afisare elemente matrice c
}
30

Exemplu alocare dinamic n apelator


#include<stdio.h>
#include<malloc.h>
void produs(float **a, float **b, int m, int n, int p, float **c)
{ 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()
{ float **a, **b, **c; int m,n,p,i,j;
//citire m, n, p;
a=(float**)malloc(m*sizeof(float*)); for(i=0;i<m;i++) a[i]=(float*)malloc (n*sizeof(float));
b=(float**)malloc(n*sizeof(float*)); for(i=0;i<n;i++) b[i]=(float*)malloc (p*sizeof(float));
//citire elemente matrice a si matrice b
c=(float**)malloc(m*sizeof(float*)); for(i=0;i<m;i++) c[i]=(float*)malloc (p*sizeof(float));
produs(a,b,m,n,p,c);
//afisare elemente matrice c
}
31

Exemplu rez. alocat dinamic n subpr.


#include<stdio.h>
#include<malloc.h>
void produs(float **a, float **b, int m, int n, int p, float ***c)
{ int i,j,k;
*c=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++) (*c)[i]=(float*)malloc (p*sizeof(float));
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()
{ float **a, **b, **c; int m,n,p,i,j;
//citire m, n, p;
a=(float**)malloc(m*sizeof(float*)); for(i=0;i<m;i++) a[i]=(float*)malloc (n*sizeof(float));
b=(float**)malloc(n*sizeof(float*)); for(i=0;i<n;i++) b[i]=(float*)malloc (p*sizeof(float));
//citire elemente matrice a si matrice b
produs(a,b,m,n,p,&c);
//afisare elemente matrice c
}
32

Exemplu rez. returnat prin numele fct.


#include<stdio.h>
#include<malloc.h>
float** produs(float **a, float **b, int m, int n, int p)
{ int i,j,k; float **c;
**c=(float**)malloc(m*sizeof(float*));
for(i=0;i<m;i++) c[i]=(float*)malloc (p*sizeof(float));
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];}
return c; }
void main()
{ float **a, **b, **c; int m,n,p,i,j;
//citire m, n, p;
a=(float**)malloc(m*sizeof(float*)); for(i=0;i<m;i++) a[i]=(float*)malloc (n*sizeof(float));
b=(float**)malloc(n*sizeof(float*)); for(i=0;i<n;i++) b[i]=(float*)malloc (p*sizeof(float));
//citire elemente matrice a si matrice b
c=produs(a,b,m,n,p);
//afisare elemente matrice c
}
33

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