Sunteți pe pagina 1din 13

Limbaje deprogramare

Cursul VII

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Funcii,pointeri,clasedememorie
Dac oexpresie este transmis caargumentpentru ofuncie, atunci secreeaz ocopie avalorii expresiei caresetransmite. nlimbajul C sefolosete apel prinvaloare ("callbyvalue"). Valoarea returnat defschimb vnumaidac scriem v=f(v), altfel nu. ninteriorul funciei fnusemodific valoarea lui v. Aceasta sedatoreaz faptului c setransmite doar ocopie a lui vctre f. nalte limbaje o funcie poate schimba valoarea lui v(apel prinreferin "callbyreference"). Vom simula apelul prinreferin transmind adresele variabilelor caargumente napelul funciei.
2 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
Pointerii sunt folosii nprograme pentru accesarea memoriei i manipularea adreselor. Deja amntlnit cuadresele variabilelor caargumente ale funciei scanf(): scanf("%d\n", &n); Dac v este ovariabil,atunci &v este adresa (sau locaia) ei nmemorie.Operatorul deadres & este unar i areaceeai preceden i asociativitate caceilali operatori unari. Variabilele pointerpotfi declarate nprograme i apoi folosite pentru alua cavalori adrese dinmemorie.
3 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
int i, *p; definete i detipint i pdetip"pointerctre int". Domeniul legaldevalori pentru orice pointercuprinde adresa special 0i omulime denumere naturale interpretate cafiind adrese dememorie alesistemului C. Constanta simbolic NULLeste 0(definit n<stdio.h>).
p = &i; p = 0; p = NULL;
/* valoarea lui p este adresa lui i */ /* valoarea lui p este adresa 0 */ /* echivalent cu p = 0; */

p = (int *) 1307; /* o adresa absoluta din memorie */

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Adreseiindirectare
Amvzut c operatorul deadres & seaplic unei variabile i ntoarce adresa sa dinmemorie.Operatorul de indirectare (sau dederefereniere)* seaplic unui pointeri returneaz valoarea scris nmemorie laadresa dat depointer. Presupunem c avem: int i =777,*p=&i; Atunci,nmemorie avem:
nume i p
5

tip int int *

valoare 777 3A38:0FFE

adres 3A38:0FFE 3A38:0FFA

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
Adresa unei variabile este dependent desistem
float x, y, *p; p = &x; y = *p;

Mainti "p"primete adresa lui "x".Apoi,"y"primete valoarea unui obiect lacarepointeaz p(adic *p).Aceste dou instruciuni deasignare sepotscrie: y = *&x; sauy = x; Unde este greeala ? int *p = &a, a;
6 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
int i = 3, j = 5, *p = &i, *q = &j, *r; double x;
expresie p == & i p=i+7 **&p r=&x 7**p/*q+7 * (r = & j) *= * p
13

expresie echiv. p == (& i) p = (i + 7) * (* (& p)) r = (& x) (((7 * (* p))) / (* q)) + 7 (* (r = (& j))) *= (* p)

valoare 1 (true) greit 3 greit 11 15

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
#include <stdio.h> #include <conio.h> void main() { int i = 777, *p = &i; printf("Valoarea lui i: %d\n", *p); printf("Adresa lui i: %lu sau %p\n", &i, &i); printf("Adresa lui i: %lu sau %p\n", p, p); printf("Valoarea lui p: %lu sau %p\n", p, p); printf("Adresa lui p: %lu sau %p\n", &p, &p); getch(); }
14 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri
Adresa lui i (valoarea lui p)va fi afiat cafiind ceva de genul: 3A38:0FFE carereprezint unnumrscris nbaza 16(cifrele sunt 0,1, ...,9,A,B,C,D,E,F)i arevaloarea 3*167+10*166+3*165+8*164+15*162+15*16+14 = 976752638 Deobservat c unpointersememoreaz ntotdeauna pe patru octei indiferent detipul variabilei ctre careseface referirea. Dece?
15 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Pointeri ctrevoid
nANSICunpointerpoatefiasignataltuiadoardac au acelaitip,saucndunuldintreeiestedetipul"void".De aceea,putemgndi"void*"cauntippointergeneric. int*p; float*q; void*v;
Asignari legale p = 0; p = (int *) 1; p = v = q; p = (int *) q;
16 Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Asignari ilegale p = 1; v = 1; p = q;

Pointeri ctrevoid
Vom discuta ncapitolele ulterioare despre funciile calloc() i malloc(),careproduc alocarea dinamic amemoriei pentru vectori i structuri.Ele returneaz unpointercatre void,deaceea putem scrie: int *a; a=calloc(...);

17

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Apelprinreferin
Am vzut c C folosete mecanismul apelului prin valoare ("callbyvalue") n cazul apelurilor funciilor i anume se fac cpii ale parametrilor actuali care se transmit funciilor. n cele ce urmeaz, vom descrie mecanismul apelului prin adres astfel asigurnd modificarea valorii variabilei transmise. Pentru aceasta, vom utiliza pointeri.

18

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

Apelprinreferin
#include <stdio.h> void interschimba(int *p, int *q); void main() { int a = 3, b = 7; printf("%d %d\n", a, b); interschimba(&a, &b); printf("%d %d\n", a, b); } void interschimba(int *p, int *q) { int tmp; tmp = *p; *p = *q; *q = tmp; }

19

Limbaje deprogramare Conf.dr.L. STOLERIU LSTOLER@UAIC.RO

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