Sunteți pe pagina 1din 4

Variabile si adrese (1)

Introducere in pointeri
• memorie este ordonata ca Memoria RAM

• variabile si adrese un tablou unidimensional : :


3 8B
• definirea si utilizarea pointerilor • o data, in functie de tipul ei, 2 25
ocupa unul sau mai multi 1 01
• pointeri si siruri 0 53
octeti
adresa datele

PCLP13 - 1 PCLP13 - 2

Variabile si adrese (2) Definirea pointerilor


Pointer (poantor)
int i = 2, j=20, k[10]={0};
- o variabila care are ca valoare o adresa in
float x=2.0, y[20]={0}, z=5.0;
memorie
Numele Adresa Dimensiunea Intervalul alocat
variabilei (hexa) (octeti) variabilei tip *identificator;
int *p; double *q; char *pc;
i 1000 2 1000 1001
- pointeri la:
j 1002 2 1002 1003
• date (tipuri simple de date, structuri,
k 1004 20 1004 1017
reuniuni)
x 1018 4 1018 101B
y 101C 80 101C 106B
• functii
z 106C 4 106C 106F
• obiecte
PCLP13 - 3 PCLP13 - 4

1
Alocarea spatiului in memorie Utilizarea pointerilor
7 f f f f f f chex Stiva int x = 2, y; x y px
int *px; 2 2 200
px = &x;
200
Date dinamice y = *px; x px
1000 8000hex
Date statice
- Operator de referentiere - &
1000 0000hex
Instructiuni
- Operator de dereferentiere - *
0040 0000hex
Rezervat y=10+*px; y=10**px; y=10/*px;
0

PCLP13 - 5 PCLP13 - 6

Initializarea pointerilor Operatii permise cu pointeri


int x = 2, y; int x = 2, y;
int *px; => int *px=&x; - adunarea si scaderea unui nr. intreg
y = *px; y = *px;
! px nu e initializat => eroare - incrementarea si decrementarea
- scaderea a doi pointeri – doar daca
ambii poanteaza la elemente ale
int *px = &x, x; => int x, *px = &x; aceluiasi sir de elemente
! x nu e cunoscut => eroare

PCLP13 - 7 PCLP13 - 8

2
Pointeri si siruri Exemple de utilizare (1)
int a[10], *pa=a; Exemplul 1: Interschimbarea valorilor a doua variabile
Element Folosind Folosind Folosind Folosind #include <stdio.h>
accesat indexarea numele pointerul pointerul ca
(ca pana tabloului ca indexat pointer void interschimbare(int *x, int *y)
acum) adresa
primul a[0] *a pa[0] *pa
{ int aux;
printf(″In functie, la intrare *x=%d, *y=%d\n″, *x, *y);
al doilea a[1] *(a+1) pa[1] *(pa+1)
aux = *x;
al treilea a[2] *(a+2) pa[2] *(pa+2) *x = *y;
al (i+1)-lea a[i] *(a+i) pa[i] *(pa+i) *y = aux;
ultimul a[n-1] *(a+n-1) pa[n-1] *(pa+n-1) printf(″In functie, la iesire, *x=%d, *y=%d\n″, *x, *y);
}
PCLP13 - 9 PCLP13 - 10

Exemple de utilizare (3)


Exemple de utilizare (2) In main, inainte de apel, a=2, b=3
In functie, la intrare *x=2, *y=3
void main() In functie, la iesire, *x=3, *y=2
{ int a, b; In main, dupa apel, a=3, b=2
a = 2;
b = 3;
printf(″In main, inainte de apel, a=%d, b=%d\n″, a, b); void main() void interschimbare(int *x, int *y)
{ int a, b; { int aux;
interschimbare(&a, &b); a = 2; printf(″In functie, la intrare *x=%d, *y=%d\n″, *x, *y);
b = 3; aux = *x;
printf(″In main, dupa apel, a=%d, b=%d\n″, a, b); printf(″In main, inainte de apel, a=%d, b=%d\n″, a, b); *x = *y;
interschimbare(&a, &b); *y = aux;
} printf(″In main, dupa apel, a=%d, b=%d\n″, a, b);
}
printf(″In functie, la iesire, *x=%d, *y=%d\n″, *x, *y);
}

PCLP13 - 11 PCLP13 - 12

3
Exemple de utilizare (5)
Exemple de utilizare (4)
void citire_sir(int n, int *sir)
Exemplu: Determinarea valorii maxime dintr-un sir de numere { int i;
intregi for( i=0; i<n; i++)
#include <stdio.h> {printf (″el[%d]=″, i+1) ;
scanf(″%d″, &sir[i]);
int max1(int n, int *a) }
{ int i, max; }
max = a[0]; void afisare_sir(int n, int *sir)
for (i=1; i<n; i++) { int i;
if(a[i] > max) for( i=0; i<n; i++)
max = a[i]; printf (″%d ″, sir[i]) ;
return max; printf(″\n″);
} }
PCLP13 - 13 PCLP13 - 14

Exemple de utilizare (6)


void main()
{ int n, x[50];
printf(″Introduceti numarul de elemente din sir: ″);
scanf(″%d″, &n);
citire_sir(n, x);
afisare_sir(n, x);
printf(″La apelul functiei max1, max=%d\n″, max1(n,x));
}

PCLP13 - 15

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