Sunteți pe pagina 1din 88

PROGRAMARE

PROCEDURAL
Bogdan Alexe
bogdan.alexe@fmi.unibuc.ro

Secia Informatic, anul I,


2016-2017
Cursul 6
Cursul trecut

1. Pointeri

2. Funcii de ci4re/scriere

3. Tablouri. iruri de caractere.

4. Structuri, cmpuri de bii, uniuni.



Programa cursului
q Introducere q Tablouri i pointeri
Algoritmi. Legtura dintre tablouri i pointeri
Limbaje de programare. Aritme4ca pointerilor
Introducere n limbajul C. Structura unui program C. Alocarea dinamic a memoriei
Complexitatea algoritmilor. Clase de memorare

q Fundamentele limbajului C q iruri de caractere
Tipuri de date fundamentale. Variabile. Constante. Funcii specice de manipulare.
Operatori. Expresii. Conversii.
Instruciuni de control
q Fiiere text i iere binare
Direc4ve de preprocesare. Macrodeniii.
Funcii specice de manipulare.
Funcii de ci4re/scriere.
Etapele realizrii unui program C.
q Structuri de date complexe i autoreferite
q Tipuri derivate de date Denire i u4lizare
Tablouri. iruri de caractere.
Structuri, uniuni, cmpuri de bii, enumerri.
q Funcii (2)
Pointeri.
Funcii cu numr variabil de argumente.
Preluarea argumentelor funciei main din linia de
q Funcii (1) comand.
Declarare i denire. Apel. Metode de trasmitere a Programare generic.
paramerilor.
Pointeri la funcii.
q Recursivitate
Cursul de azi
1. Enumerri, typedef.

2. Funcii: declarare i denire, apel, metode


transmitere a parametrilor.

3. Pointeri la funcii.

4. Legtura dintre tablouri i pointeri.

5. Aritme4ca pointerilor.
Tipuri de date structurate
Limbajul C permite creare 4purilor de date n 5 moduri:

q structura (struct) grupeaz mai multe variabile sub acelai


nume;

q cmpul de bii (variaiune a structurii) acces uor la biii


individuali

q uniunea (union) face posibil ca aceleai zone de memorie s


e denite ca dou sau mai multe 4puri diferite de variabile

q enumerarea (enum) list de constante ntregi cu nume

q 4puri denite de u4lizator (typedef) denete un nou nume


pentru un 4p existent
Enumerri
q mulime de constante de tip ntreg care specific toate
valorile permise pe care le poate avea o variabila de acel tip
q att numele generic al enumerrii ct i lista de variabile
sunt opionale
q constanta unui element al enumerrii este fie asociat
implicit, fie explicit. Implicit, primul element are asociat
valoarea 0, iar pentru restul este valoarea precedent+1.

q sintaxa:
enum <nume> {
lista enumerarilor
} lista variabile;


Enumerri
q exemplu
enum {a, b, c, d}; a = 0, b = 1, c = 2, d = 3

enum {a, b, c=7, d}; a = 0, b = 1, c = 7, d = 8

enum {a=4, b=-3, c=9, d=-8}; enum {false,true};


Enumerri
q exemplu
enum {a, b, c, d}; a = 0, b = 1, c = 2, d = 3

enum {a, b, c=7, d}; a = 0, b = 1, c = 7, d = 8

enum {a=4, b=-3, c=9, d=-8}; enum {false,true};


Enumerri
q exemplu
Specicatorul typedef
q definete explicit noi tipuri de date.

q nu se declar o variabil sau o funcie de un anumit tip, ci se


asociaz un nume (sinonimul) tipului de date.

q sintaxa:
typedef <deniie Qp> <idenQcator>;

q exemple:
typedef unsigned int natural;
typedef long double tablouNumereReale [100] ;
tablouNumereReale a, b, c;
natural m,n,i;


Specicatorul typedef
Cursul de azi
1. Enumerri, typedef.

2. Funcii: declarare i denire, apel, metode


transmitere a parametrilor.

3. Pointeri la funcii.

4. Legtura dintre tablouri i pointeri

5. Aritme4ca pointerilor
Funcii
q permit modularizarea programelor
q variabilele declarate n interiorul funciilor variabile locale (vizibile
doar n interior)

q parametri funciilor
q permit comunicarea informaiei ntre funcii
q sunt variabile locale funciilor

q avantajele utilizrii funciilor


q divizarea problemei n subprobleme
q managementul dezvoltrii programelor
q utilizarea/reutilizarea funciilor scrise n alte programe
q elimin duplicarea codului scris

Funcii
q o funcie = bloc de instruciuni care nu se poate executa de sine
stttor ci trebuie apelat.


q sintaxa:
antetul funciei
Qp_returnat nume_funcQe (lista parametrilor formali) (declarare)
{ variabile locale
instruc4uni; corpul funciei
(denire)
return expresie;
}

q lista de parametri formali poate fi reprezentata de:
q nici un parametru:
q tip_returnat nume_functie ()
q tip_returnat nume_functie (void)
q unul sau mai muli parametri separai prin virgul.
Valoarea returnat de o funcie
q dou categorii de funcii:
q care returneaz o valoare: prin utilizarea instruciunii return expresie;
q care nu returneaz o valoare: prin instruciunea return; (tipul returnat
este void)

q returnarea valorii
q poate returna orice tip standard (void, char, int, float, double) sau definit
de utilizator (structuri, uniuni, enumerari, typedef)

q declaraiile i instruciunile din funcii sunt executate pn se ntlnete


q instruciunea return

q acolada nchis } - execuia atinge finalul funciei


Valoarea returnat de o funcie
double f(double t)
{ denire de funcie
return t-1.5;
}

float g(int); declaraie de funcie

int main() Rezultat afiat


{ 10.000000
float a=11.5;
printf("%f\n",f(a)); 13.000000
printf("%f\n",g(a));
}
float g(int z)
{ denire de funcie
return z+2.0;
}
Proto4pul i argumentele funciilor
q prototipul unei funcii (declararea ei) const n specificarea
antetului urmat de caracterul ;
q nu este necesar specificarea numelor parametrilor formali
int adunare(int, int);

q este necesar inserarea prototipului unei funcii naintea altor funcii n


care este invocat dac definirea ei este localizat dup definirea acelor
funcii

q parametri apar n definiii


q argumentele apar n apelurile de funcii
q corespondena ntre parametrii formali (definiia funciei) i actuali
(apelul funciei) este poziional
q regula de conversie a argumentelor
q n cazul n care difer, tipul fiecrui argument este convertit automat
la tipul parametrului formal corespunztor (ca i n cazul unei simple
atribuiri)
Proto4pul i argumentele funciilor

Rezultatul aat

44
49
Fiiere header cu extensia .h
q conin prototipuri de funcii

q bibliotecile standard
q conin prototipuri de funcii standard regsite n fiierele
header corespunztoare (ex. stdio.h, stdlib.h, math.h,
string.h
q exemplu biblioteca stdio.h care conine i prototipul
funciei
q printf: int printf(const char* format, ...);
q se ncarc cu #include <filename.h>

q biblioteci utilizator
q conin prototipuri de funcii i macrouri
q se pot salva ca fiiere cu extensia .h : ex. filename.h
q se ncarc cu #include filename.h
Transmiterea parametrilor ctre funcii
q utilizat la apelul funciilor

q n limbajul C transmiterea parametrilor se poate face doar


prin valoare (pass-by-value)
q o copie a argumentelor este trimis funciei
q modificrile n interiorul funciei nu afecteaz argumentele
originale

q n limbajul C++ transmiterea parametrilor apelul se poate face


i prin referin (pass-by-reference)
q argumentele originale sunt trimise funciei
q modificrile n interiorul funciei afecteaz argumentele
trimise
Cod scris n C++ !!!

apel prin valoare

apel prin referin


numai n C++
apel prin valoare
Transmiterea parametrilor ctre funcii
q utilizat la apelul funciilor

q n limbajul C transmiterea parametrilor se poate face doar


prin valoare (pass-by-value)
q o copie a argumentelor este trimis funciei
q modificrile n interiorul funciei nu afecteaz argumentele
originale

q pentru modificarea parametrilor actuali, funciei i se transmit


nu valorile parametrilor actuali, ci adresele lor (pass by
pointer). Funcia face o copie a adresei dar prin intermediul ei
lucreaz cu variabila real (zona de memorie real). Astfel
putem simula n C transmiterea prin referin cu ajutorul
pointerilor.
Transmiterea parametrilor ctre funcii
Transmiterea parametrilor ctre funcii
Transmiterea parametrilor ctre funcii
Apelul funciei i revenirea din apel
q etapele principale ale apelului unei funciei i a revenirii din
acesta n funcia de unde a fost apelat:
q argumentele apelului sunt evaluate i trimise funciei
q adresa de revenire este salvat pe stiv
q controlul trece la funcia care este apelat
q funcia apelat aloc pe stiv spaiu pentru variabilele
locale i pentru cele temporare
q se execut instruciunile din corpul funciei
q dac exist valoare returnat, aceasta este pus ntr-un
loc sigur
q spaiul alocat pe stiv este eliberat
q utiliznd adresa de revenire controlul este transferat n
funcia care a iniiat apelul, dup acesta
Harta simplicat a memoriei la rularea unui program

zona de HEAP: pot aloca


dinamic memorie aici i prin
intermediul aritmeQcii
pointerilor reine informaie

variabilele locale automaQce


parametrii funciilor
adresa de retur a funciei
variabilele globale
siruri iniializate i constante
variabilele locale staQce

variabile registru

codul asociat funciilor


Harta simplicat a memoriei la rularea unui program
Harta simplicat a memoriei la rularea unui program
S4va n C
q la execuia programelor C se utilizeaz o structur intern
numit stiv i care este utilizat pentru alocarea memoriei i
manipularea variabilelor temporare

q pe stiv sunt alocate i memorate:


q variabilele locale din cadrul funciilor
q parametrii funciilor
q adresele de retur ale funciilor

q dimensiunea implicit a stivei este redus


q n timpul execuiei programele trebuie s nu depeasc
dimensiunea stivei
q dimensiunea stivei poate fi modificat n prealabil din
setrile editorului de legturi (linker)
S4va n C depirea dimensiunii
q ambele programe eueaz n timpul execuiei din
cauza depirii dimensiunii stivei

int f() int f(int a,int b)


{ {
int a[10000000]={0}; if (a<b)
} return 1+f(a+1,b-1);
else
int main() return 0;
{ }
f();
return 0; int main()
} {
printf("%d",f(0,1000000));
}
Cursul de azi
1. Enumerri, typedef.

2. Funcii: declarare i denire, apel, metode


transmitere a parametrilor.

3. Pointeri la funcii.

4. Legtura dintre tablouri i pointeri

5. Aritme4ca pointerilor
Pointeri la funcii
q pointer la o funcie = variabil ce stocheaz adresa de
nceput a codului asociat funciei
zona de HEAP: alocare dinamic

variabilele locale automaQce


parametrii funciilor
adresa de retur a funciei
variabilele globale
siruri iniializate i constante
variabilele locale staQce

variabile registru

codul asociat funciilor


Harta simplicat a memoriei la rularea unui program

Numele unei funcii


nensoit de o list de
argumente este
adresa de nceput a
codului funciei i
este interpretat ca un
pointer la funcia
respec4v
Harta simplicat a memoriei la rularea unui program
Pointeri la funcii
q pointer la o funcie = variabil ce stocheaz adresa de
nceput a codului asociat funciei

q sintaxa: tip (*nume_pointer_functie) (tipuri argumente)


q tip = tipul de baz returnat de funcia spre care pointeaza
nume_pointer_functie

q nume_variabila = variabila de tip pointer la o functie care poate lua ca valori


adrese de memorie unde ncepe codul unei funcii

q observaie: trebuie s pun parantez n definiie altfel definesc o funcie care


ntoarce un un pointer de date

q exemple: void (*pf)(int)


int (*pf)(int, int)
double (*pf)(int, double*)
Pointeri la funcii

1. pentru a asigura unui


pointer adresa unei func4i,
trebuie folosit numele
func4ei fara paranteze.
2. numele unei funcii este un
pointer spre adresa sa de
nceput din segmentul de
cod: f==&f
Tablouri de pointeri la funcii

ecare element din tablou


pointeaz ctre o alt funcie
Tablouri de pointeri la funcii

ecare element din tablou


pointeaz ctre o alt funcie.
Funciile au 4pul void.
U4litatea pointerilor la funcii
q se folosesc n programarea generic, realizm apeluri de tip
callback;

q o funcie C transmis, printr-un pointer, ca argument unei alte


funcii F se numete i funcie callback, pentru c ea va fi
apelat napoi de funcia F

q exemple:
1. int suma(int n, int (*expresie)(int)); (sum generic de n numere)

2. void qsort(void *adresa,int nr_elemente, int dimensiune_element, int


(*cmp)(const void *, const void *)) ; (funcia qsort din stdlib.h)
U4litatea pointerilor la funcii
n

q exemplul 1: vreau s calculez suma Sk (n) = ik
i=1

S1 (n) = 1 + 2 + ... + n
S2 (n) = 12 + 22 + ... + n2
n
Sk (n) = expresie(i)
i=1
Folosind pointeri la funcii pot
s vd funcia ca o variabil
U4litatea pointerilor la funcii
n

q exemplul 1: vreau s calculez suma Sk (n) = ik
i=1
q implementare elegant:
U4litatea pointerilor la funcii
n

q exemplul 1: vreau s calculez suma Sk (n) = ik
i=1
U4litatea pointerilor la funcii
q exemplul 2: funcia qsort din stdlib.h folosit pentru sortarea
unui vector/tablou. Antetul lui qsort este:

void qsort (void *adresa, int nr_elemente, int dimensiune_element,


int (*cmp) (const void *, const void *)
adresa = pointer la adresa primului element al tabloului ce urmeaza a sortat
(pointer generic nu are o aritme4c inclus)

nr_elemente = numarul de elemente al vectorului

dimensiune_element = dimensiunea in octei a ecrui element al tabloului


(char = 1 octet, int = 4 octei, etc)

cmp funcia de comparare a dou elemente


Cursul de azi
1. Enumerri, typedef.

2. Funcii: declarare i denire, apel, metode


transmitere a parametrilor.

3. Pointeri la funcii.

4. Legtura dintre tablouri i pointeri

5. Aritme4ca pointerilor
Legtura dintre pointeri i tablouri 1D
q un pointer: variabil care poate stoca adrese de memorie
q exemple: int a=5 p a
int *p; to point
p = &a;
adresa a 5

adresa p adresa a

q un tablou 1D: set de valori de acelai tip memorat la adrese


succesive de memorie
q exemplu: int a[10];

0
a[0] a[[1] a[2] a[3] a[4] a[9]
Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul pointerilor

q iniializarea pointerului p cu adresa primului element al unui


tablou
q int *p = v;
q p = &v[0];
q numele unui tablou este un pointer (constant) spre
primul su element

q cum pot s gsesc adresa/valoarea celui de-al i-lea element


din vectorul v pe baza pointerului p (p pointeaz ctre adresa
de nceput a tabloului)?
Modelatorul const
q modelatorul const precizeaz pentru o variabil iniializat c
nu este posibil modificarea variabilei respectiv. Dac se
ncearc acest lucru se returneaz eroare la compilarea
programului.
Modelatorul const
q modelatorul const precizeaz pentru o variabil iniializat c
nu este posibil modificarea variabilei respectiv. Dac se
ncearc acest lucru se returneaz eroare la compilarea
programului.
q putem modifica valoarea unei variabile nsoite de
modelatorul const prin intermediul unui pointer (n mod
indirect):
Pointeri la valori constante
q modelatorul const poate preciza pentru un pointer c
valoarea variabilei aflate la adresa coninut de pointer nu se
poate modifica.

q putem modifica valoarea pointerului:


Pointeri constani
q modelatorul const poate preciza pentru un pointer c nu
poate referi o alt adres dect cea pe care o conine la
iniializare.

q putem modifica valoarea variabilei aflate la adresa coninut de pointer:


Pointeri constani la valori constante
q modelatorul const poate preciza pentru un pointer c nu
poate referi o alt adres dect cea pe care o conine la
iniializare i de asemenea c nu poate schimba valoare
variabilei aflate la adresa pe care o conine.
Pointeri constani vs. valori constante
q diferenele constau n poziionarea modelatorului const
nainte sau dup caracterul *:

q pointer constant: int* const p;

q pointer la o constant: const int* p;

q pointer constant la o constant: const int* const p;

q dac declarm o funcie asqel:



void f(const int* p)

atunci valorile din zona de memoria referit de p nu pot modicate.
Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul pointerilor

q iniializarea pointerului p cu adresa primului element al unui


tablou
q int *p = v;
q p = &v[0];
q numele unui tablou este un pointer (constant) spre
primul su element

q cum pot s gsesc adresa/valoarea celui de-al i-lea element


din vectorul v pe baza pointerului p (p pointeaz ctre adresa
de nceput a tabloului)?
Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul
pointerilor
Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul
pointerilor
Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul
pointerilor

q adresa lui v[i]: &v[i] = p+i

q valoarea lui v[i]: v[i] = *(p+i)

q comutativitate: v[i] = *(p+i) = *(i+p) = i[v] ?!


Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul
pointerilor

Concluzie?
Legtura dintre pointeri i tablouri 1D
q adresarea unui element dintr-un tablou cu ajutorul
pointerilor

q conceptul de tablou nu exist n limbajul C. Numele unui


tablou este un pointer (constant) spre primul su
element.

q la compilare, expresia v[i] se nlocuiete cu *(v+i). Atunci,


i[v] este o expresie corect ntruct i[v] se nlocuiete cu
*(i+v) = *(v+i). Deci, v[i] = i[v].

q &v[i] = &(*(v+i))= v + i => &v[0] = v


Legtura dintre pointeri i tablouri 1D
q numele unui tablou este un pointer constant spre primul su
element.
int v[100]; v = &v[0];

int a[10][10]; a = &a[0][0];


q elementele unui tablou pot accesate prin pointeri:
index 0 1 i n-1
accesare directa v[0] v[1] v[i] v[n-1]
accesare indirecta *v *(v+1) *(v+i) *(v+n-1)
adresa v v+1 v+i v+n-1
q operatorul * are prioritate mai mare ca +
q *(v+1) e diferit de *v+1
Legtura dintre pointeri i tablouri 1D
index 0 1 i n-1
accesare directa v[0] v[1] v[i] v[n-1]
accesare indirecta *v *(v+1) *(v+i) *(v+n-1)
adresa v v+1 v+i v+n-1
q o expresie cu tablou i indice este echivalent cu una scris
ca pointer i distan de deplasare: v[i] = *(v+i)

q diferena dintre un nume de tablou i un pointer:


q un pointer i poate schimba valoarea: p = v i p++ sunt
expresii corecte

q un nume de tablou este un pointer constant (nu i poate


schimba valoarea): v = p i v++ sunt expresii incorecte
Legtura dintre pointeri i tablouri 2D
0 1 2 3 4
int a[3][5]; 0 3 -12 10 7 1
1 10 2 0 -7 41
a[1][4] = 41;
2 -3 -2 0 0 2

3 -12 10 7 1 10 2 0 -7 41 -3 -2 0 0 2
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[2][4]

Reprezentarea n memoria calculatorului a unui tablou bidimensional

q tablou bidimensional = tablou de tablouri



3 -12 10 7 1 10 2 0 -7 41 -3 -2 0 0 2

a[0] a[1] a[2]


Pointeri la pointeri (pointeri dubli)
q sintaxa
tip **nume_variabil;
Qp = 4pul de baz al variabilei de 4p pointer dublu nume_variabil;
* = operator de indirectare;
nume_variabila = variabila de 4p pointer dublu care poate lua ca valori adrese de memorie
ale unor variabile de 4p pointer.

q exemplu: q p a
int a=5
adresa p
adresa a 5
int *p;

p = &a;
int **q; adresa q adresa p adresa a
q = &p;

indirectare simpl

indirectare mul4pl
Pointeri la pointeri
q exemplu:
Pointeri la pointeri
q exemplu:

q p a



1606416736
1606416748
5

1606416728 1606416736 1606416748
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
q cazul general: int a[m][n];
0 i m-1
0 1 j n-1 0 1 j n-1 0 1 j n-1
a

Reprezentarea n memoria calculatorului a unui tablou bidimensional

a[i] este un tablou unidimensional. La ce adres ncepe a[i]?


Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
q cazul general: int a[m][n];
0 i m-1
0 1 j n-1 0 1 j n-1 0 1 j n-1
a

Reprezentarea n memoria calculatorului a unui tablou bidimensional

a[i] este un tablou unidimensional. La ce adres ncepe a[i]?


a[i] ncepe la adresa &a[i] = &(*(a+i)) = a+i
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
q cazul general: int a[m][n];
0 i m-1
0 1 j n-1 0 1 j n-1 0 1 j n-1
a

Reprezentarea n memoria calculatorului a unui tablou bidimensional

a[i] este un tablou unidimensional. La ce adres ncepe a[i]?


a[i] ncepe la adresa &a[i] = &(*(a+i)) = a+I
Care este adresa lui a[i][j]? Cum o exprim n aritmeQca pointerilor n
funcie de a, i, j?

Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
q cazul general: int a[m][n];
0 i m-1
0 1 j n-1 0 1 j n-1 0 1 j n-1
a

Reprezentarea n memoria calculatorului a unui tablou bidimensional

a[i] este un tablou unidimensional. La ce adres ncepe a[i]?


a[i] ncepe la adresa &a[i] = &(*(a+i)) = a+I
Care este adresa lui a[i][j]? Cum o exprim n aritmeQca pointerilor n
funcie de a, i, j?
Adresa lui a[i][j] = &a[i][j] = *(a+i)+j (a este pointer dublu).
Cum exprim valoarea lui a[i][j] n aritmeQca pointerilor n funcie de
a, i, j?
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
q cazul general: int a[m][n];
0 i m-1
0 1 j n-1 0 1 j n-1 0 1 j n-1
a

Reprezentarea n memoria calculatorului a unui tablou bidimensional
a[i] este un tablou unidimensional. La ce adres ncepe a[i]?
a[i] ncepe la adresa &a[i] = &(*(a+i)) = a+I
Care este adresa lui a[i][j]? Cum o exprim n aritmeQca pointerilor n
funcie de a, i, j?
Adresa lui a[i][j] = &a[i][j] = *(a+i)+j (a este pointer dublu).
Cum exprim valoarea lui a[i][j] n aritmeQca pointerilor n funcie de
a, i, j?
a[i][j] = *(*(a+i)+j) = valoarea lui a[i][j]
Legtura dintre pointeri i tablouri 2D
q tablou bidimensional = tablou de tablouri
q cazul general: int a[m][n];
Adresa lui a[i][j] = *(a+i)+j (a este pointer dublu).
Valoarea lui a[i][j] = *(*(a+i)+j)
Qu c a[i] = *(a+i) = i[a]. Atunci a[i][j] se mai poate scrie ca:
1. *(a[i]+j)
2. *(i[a] + j)
3. (*(a+i))[j]
4. i[a][j]
5. j[i[a]]
6. j[a[i]]
Cursul de azi
1. Enumerri, typedef.

2. Funcii: declarare i denire, apel, metode


transmitere a parametrilor.

3. Pointeri la funcii.

4. Legtura dintre tablouri i pointeri

5. Aritme4ca pointerilor
Aritme4ca pointerilor
q asupra pointerilor pot fi realizate operaii artimetice:

q incrementare (++), decrementare (--);

q adugare (+ sau +=) sau scdere a unui intreg (- sau -=)

q scdere a unui pointer din alt pointer;

q asignri;

q comparaii.
Aritme4ca pointerilor
q iniializarea unui pointer cu adresa primul element al unui
tablou

v este un pointer care


pointeaza ctre v[0]
Aritme4ca pointerilor
q adunarea/scderea unui numr natural dintr-un pointer

5fbff950 5fbff954 5fbff958 5fbff962 5fbff966

V[0] V[1] V[2] V[3] V[4]

5fbff950 + 2 5fbff952 5fbff950 + 2 = 5fbff958


p

qn aritmetica pointerilor adugarea unui ntreg la o


adres de memorie are ca rezultat o nou adres de
memorie!
5fbff950 5fbff954 5fbff958 5fbff962 5fbff966

V[0] V[1] V[2] V[3] V[4]

p=p+2
Aritme4ca pointerilor
q adunarea/scderea unui numr natural dintr-un pointer
Aritme4ca pointerilor
q adunarea/scderea unui numr natural dintr-un pointer
Aritme4ca pointerilor
q adunarea/scderea unui numr natural dintr-un pointer

q adunarea cu n: adresa aat peste n locaii de memorie


de adresa curent stocat n pointer (la dreapta, se
obine adugnd la adresa curent n*sizeof(*p) octei)
de acelai 4p cu 4pul de baz al variabilei de 4p pointer

q scderea cu n: adresa aat nainte cu n locaii de


memorie de adresa curent stocat n pointer (la
stnga, se obine scznd la adresa curent n*sizeof
(*p) octei) de acelai 4p cu 4pul de baz al variabilei de
4p pointer

Aritme4ca pointerilor
q scderea a dou variabile de 4p pointer

Aritme4ca pointerilor
q scderea a dou variabile de 4p pointer

1606416704 1606416716
V[0] V[1] V[2] V[3] V[4]

p q

q n aritmetica pointerilor diferena dintre doi pointeri reprezint


numrul de obiecte de acelai tip care despart cele dou
adrese

p q > 0 nseamn c p e la dreapta lui q


p q < 0 nseamn c p e la stnga lui q
Aritme4ca pointerilor
q compararea a dou variabile de 4p pointer

Aritme4ca pointerilor
q compararea a dou variabile de 4p pointer = compararea
diferenei lor cu 0

Aritme4ca pointerilor
q compararea unei variabile de 4p pointer cu constanta
NULL (0)

Aritme4ca pointerilor
q observaie: aritme4ca pointerilor are sens i este sigur
dac adresele implicate sunt adrese ale elementelor unui
tablou.

Aritme4ca pointerilor
q observaie: aritme4ca pointerilor are sens i este sigur
dac adresele implicate sunt adrese ale elementelor unui
tablou.

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