Limbaj de programare C7

download Limbaj de programare C7

of 13

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]