Limbaj de programare C7
Transcript of Limbaj de programare C7
-
7/31/2019 Limbaj de programare C7
1/13
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
Cursul VII
Limbaje deprogramare
-
7/31/2019 Limbaj de programare C7
2/13
Funcii,pointeri,clasedememorie
Dac oexpresie este transmis caargumentpentru ofuncie,atunci secreeaz ocopie avalorii expresiei caresetransmite.
nlimbajul C sefolosete apel prinvaloare ("callby
value").
Valoarea returnat defschimb vnumaidac scriem v=f(v),altfel nu. ninteriorul funciei fnusemodific valoarea lui v.
Aceasta sedatoreaz faptului c setransmite doar ocopie alui vctre f.
nalte limbaje o funcie poate schimba valoarea lui v(apel
prinreferin "callby
reference").
Vom simula apelul prinreferin transmind adreselevariabilelor caargumente napelul funciei.
2 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
3/13
Pointeri
Pointerii sunt folosii nprograme pentru accesareamemoriei i manipularea adreselor.
Deja amntlnit cuadresele variabilelor caargumente alefunciei scanf():
scanf("%d\n", &n);
Dac v este ovariabil,atunci &v este adresa (saulocaia) ei nmemorie.Operatorul deadres & este unari 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 [email protected]
-
7/31/2019 Limbaj de programare C7
4/13
Pointeri
int i, *p;
definete i detipint i pdetip"pointerctre int".
Domeniul legaldevalori pentru orice pointercuprindeadresa special 0 i omulime denumere naturaleinterpretate cafiind adrese dememorie alesistemului C.
Constanta simbolic NULLeste 0(definit n).
p = &i; /* valoarea lui p este adresa lui i */
p = 0; /* valoarea lui p este adresa 0 */
p = NULL; /* echivalent cu p = 0; */
p = (int *) 1307; /* o adresa absoluta din memorie */
4 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
5/13
Adrese iindirectare
Amvzut c operatorul deadres & seaplic uneivariabile i ntoarce adresa sa dinmemorie.Operatorul de
indirectare (sau dederefereniere)* seaplic unuipointer i returneaz valoarea scris nmemorie laadresadat depointer.
Presupunem c avem:int i =777,*p=&i;
Atunci,nmemorie avem:
5
nume tip valoare adres
i int 777 3A38:0FFE
p int * 3A38:0FFE 3A38:0FFA
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
6/13
Pointeri
Adresa unei variabile este dependent desistemfloat x, y, *p;
p = &x;
y = *p;
Mainti "p"primete adresa lui "x".Apoi,"y"primete
valoarea unui obiect lacarepointeaz p(adic *p).Acestedou instruciuni deasignare sepotscrie:
y = *&x; sau y = x;
Unde este greeala ?int *p = &a, a;
6 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
7/13
Pointeri
int i = 3, j = 5, *p = &i, *q = &j, *r;
double x;
13
expresie expresie echiv. valoare
p == & i p == (& i) 1 (true)
p = i + 7 p = (i + 7) greit
* * & p * (* (& p)) 3
r = & x r = (& x) greit
7 * * p / * q + 7 (((7 * (* p))) / (* q)) + 7 11
* (r = & j) *= * p (* (r = (& j))) *= (* p) 15
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
8/13
Pointeri#include
#include
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 [email protected]
-
7/31/2019 Limbaj de programare C7
9/13
Pointeri
Adresa lui i (valoarea lui p)va fi afiat cafiind ceva degenul:
3A38:0FFEcarereprezint 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 pepatru octei indiferent detipul variabilei ctre caresefacereferirea. Dece?
15 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
10/13
Pointeri ctrevoid
nANSICunpointerpoatefiasignataltuiadoardac auacelaitip,saucndunuldintreeiestedetipul"void".De
aceea,putemgndi"void*"cauntippointergeneric.int *p;
float*q;
void *v;
16
Asignari legale Asignari ilegale
p = 0; p = 1;p = (int *) 1; v = 1;
p = v = q; p = q;
p = (int *) q;
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
11/13
Pointeri ctrevoid
Vom discuta ncapitolele ulterioare despre funciilecalloc() i malloc(),careproduc alocarea
dinamic amemoriei pentru vectori i structuri.Elereturneaz unpointercatre void,deaceea putem scrie:
int *a;
a=calloc(...);
17 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
12/13
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 transmitfunciilor.
n cele ce urmeaz, vom descrie mecanismul apelului prin
adres astfel asigurnd modificarea valorii variabileitransmise. Pentru aceasta, vom utiliza pointeri.
18 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
-
7/31/2019 Limbaj de programare C7
13/13
Apelprinreferin#include
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);
}
19
void interschimba(int *p, int *q)
{
int tmp;tmp = *p;
*p = *q;
*q = tmp;
}
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]