Programarea Calculatoarelor M8

download Programarea Calculatoarelor M8

of 12

  • date post

    09-Apr-2018
  • Category

    Documents

  • view

    218
  • download

    0

Embed Size (px)

Transcript of Programarea Calculatoarelor M8

  • 8/8/2019 Programarea Calculatoarelor M8

    1/12

    Programarea Calculatoarelor(limbajul C)

    Curs 8 Lucrul cu pointeri ifiiere de date

    Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i

    Tehnologia Informaiei

    .l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN

    2010-20112

    Cuprins

    8.1. Lucrul cu pointeri

    8.2. Lucrul cu fiiere de date

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 1/66

    3Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 2/66

    8.1. Lucrul cu pointeri

    4Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 3/66

    Ce reprezint un pointer ?

    > Pentru a nelege noiunea de pointer vom relua n discuienoiunea de variabil.

    > Variabil = un container sau o zon de memorie n caresunt stocate anumite valori.

    2009

    > Zona de memorie nu este oarecare, ci aceasta are o anumitadres unic (un numr) pe baza creia se poate face referinla ea.

    2567843

    valoarea variabilei

    adresa de memorie

    > Variabila este identificat printr-un nume alfanumeric unic.

    VarA

    nume

    5Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 4/66

    Ce reprezint un pointer ? (continuare)

    2009

    2567843

    valoarea variabilei

    adresa de memorie

    VarA

    nume

    Ce se ntmpl dac scriem:

    printf(%d, VarA);

    Dar dac scriem:

    printf(%d, &VarA);

    >2009

    >2567843

    VarA indic

    valoarea

    &VarA indic

    adresa

    6Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 5/66

    Ce reprezint un pointer ? (continuare)

    > Un pointer este tot o variabil, adic o locaie de memorie.

    > Acesta difer de variabilele clasice prin faptul c, n loc sstocheze valori, acesta stocheaz doar adrese ale locaiilordin memorie.

    > De aici i denumirea de pointer indicator, prin intermediuladresei pe care o stocheaz, putem spune c acesta indicspre coninutul unei alte locaii de memorie.

    PointerA

    2009

    2567843

    adresa variabilei pointer

    10000

    2567843PointerA

    valoarea pointerului

  • 8/8/2019 Programarea Calculatoarelor M8

    2/12

    7Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 6/66

    Lucrul cu pointeri

    > Pointerii constituie fundamentul limbajului C, acetia oferindo multitudine de avantaje:

    - rapiditate n manipularea datelor, exemplu: vrem s

    copiem valorile vectorului A n vectorul B, folosindpointerii este suficient s stocm adresa primului elementdin A n adresa primului element din B,

    - eficientizare a memoriei, variabilele definite ca pointeripot fi alocate dinamic: se aloc cnd vrem, ct vrem ict timp vrem (se poate elibera memoria),

    - anumite calcule nu pot fi exprimate dect pe bazapointerilor,

    8Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 7/66

    Lucrul cu pointeri (continuare)

    > Avantaje (continuare):

    - o funcie poate returna mai multe valori cu ajutorulpointerilor, returnnd astfel adresa la care se gsesc

    acestea (de exemplu, adresa de nceput a unui vector)- transmiterea valorilor prin adres (pointer) nfuncii permite modificarea valorilor acestora, ceea ce nueste valabil cnd parametrul funciei este transmis prinvaloare (cazul clasic),

    - etc.

    > Principalul dezavantaj este dat manipularea acestora, cenecesit anumite precauii, anumite greeli de manipularenefiind sesizate de compilator !!!

    9Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 8/66

    Lucrul cu pointeri (continuare)

    > n limbajul C studiat pn n acest punct, ai lucrat deja cupointeri, i anume la:

    - lucrul cu vectori i matrice,

    - lucrul cu funcii.

    - lucrul cu iruri de caractere,

    - lucrul cu structuri de date i uniuni,

    *;

    > Modul de definire al unui pointer:

    > Efect: variabila va fi un pointer ce indic olocaie de memorie ce stocheaz valori de tip .

    10Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 9/66

    Lucrul cu pointeri (continuare)

    int *PointerInt;double *PointerReal;

    > Exemple:PointerInt va conine adresa uneilocaii de memorie ce stocheaz

    ntregi (32 bii),PointerReal va conine adresa uneilocaii de memorie ce stocheazdouble (64 bii),

    > Atenie: tipul datelor indicate este specificat tocmai pentru c

    acestea sunt stocate diferit, astfel nu putem suprapune undouble peste int.

    > Care sunt ustensilelede care dispunem n lupta cu pointerii:- operatorul unar& = adresa unei variabile,

    - operatorul de indirectare * = coninutul obiectului indicatde pointer (coninutul de la adresa stocat de pointer).

    11Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 10/66

    Lucrul cu pointeri (continuare)

    int x=1, y=2;int *ip;

    > Exemplu utilizare pointeri:

    adr.100

    x

    1

    adr.200

    y

    2

    adr.1000

    ip

    ?*!#

    > Efect:- la adresa variabilei x (ex.100) am pus valoarea 1,

    - la adresa lui y (ex. 200) am pus valoarea 2,

    - la adresa pointerului ip (ex. 1000) am pus valoarea ???

    > Cnd un pointer este declarat, nu conine o adres valid,

    de regul indic ctre o zon de memorie care, de cele maimulte ori nici nu aparine programului.

    > Dup declarare, precum variabilele,pointerul trebuie iniializat.

    adr.100 adr.200 adr.1000

    x y ip

    1 100

    12Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 11/66

    Lucrul cu pointeri (continuare)

    > Exemplu utilizare pointeri (continuare):

    ip=&x;

    adr.1000

    ip

    adr.100 adr.200

    x y

    1 2 100

    > Traducere: la adresa de memorie a variabilei pointerip seva stoca adresa (dat de operatorul &) variabilei x.

    pointerul ip indic acum ctre variabila x.

    y=*ip; 1

    > Traducere: variabila y preia valoarea de la adresa stocat npointerul ip sau cu alte cuvinte, coninutul obiectului indicat deip (returnat de operatorul *).

    ???

    ???

  • 8/8/2019 Programarea Calculatoarelor M8

    3/12

    adr.100 adr.200 adr.1000

    2

    x y ip

    adr.100 adr.200 adr.1000

    2 100

    x y ip

    13Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 12/66

    Lucrul cu pointeri (continuare)

    > Exemplu utilizare pointeri (continuare):

    x=ip; 100

    > Traducere: variabila x va lua valoarea variabilei pointerip, ianume adresa coninut de aceasta, care este adresa lui x.

    *ip=3; 3 100

    > Traducere: coninutul obiectului indicat de pointerul ip, ianume locaia de memorie de la adresa 100 va primi valoarea 3.

    variabila x are valoarea 3 (echivalent x=3).

    ???

    ???

    14Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 13/66

    Lucrul cu pointeri (continuare)

    > Recapitulare:

    int *ip;

    ipnseamn:coninutul variabilei pointer ip i anumeo adres la o variabil de tip ntreg.

    &ipnseamn:adresa din memorie a variabilei pointer ipi anume locaia unde stocheaz adresele

    *ipnseamn:coninutul obiectului indicat de pointer ianume coninutul locaiei de memorie dela adresa memorat de pointer (adr. ip)

    adr.A adr.B

    ip x

    15Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 14/66

    Aritmetica pointerilor

    > Fiind variabile, pointerii permit efectuarea a o serie deoperaii specifice variabilelor.

    int *ip;*ip=100;

    Care este efectul acestor instruciuni ?

    adr.

    ip

    ?*!#

    adr. ?*!#

    100

    > Greeal tipic: un pointer trebuie iniializat, deoarece altfeleste posibil s indice o locaie inaccesibil.

    Corect ar fi:

    int *ip, x;ip=&x;*ip=100;

    adr.B 100

    char*mychar;short *myshort;long *mylong;

    16Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 15/66

    Aritmetica pointerilor (continuare)

    > Exemplu 1*:

    *http://www.cplusplus.com/doc/tutorial/pointers.html

    - mycharindic o locaie de memorie pe8 bii (1 byte),- myshort indic o locaie de memoriepe 16 bii (2 bytes),- mylong indic o locaie de memorie pe32 bii (4 bytes),

    mychar++;

    myshort++;mylong++;

    mychar=1000;

    myshort=2000;mylong=3000;

    17Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 16/66

    Aritmetica pointerilor (continuare)

    > Exemplu 2:

    int *p, x;p=&x;*p++=10;

    - p este un pointer care indic variabilantreag x.

    >Atenie: operatorii ++ i -- au prioritate mai mare dectoperatorul * (vezi Cursul 5).

    > Astfel, *p++ este echivalent cu *(p++).

    p p++

    adr.A

    8 bii

    adr.A+1

    8 bii

    x

    8 bii 8 bii

    adr.A+2 adr.A+3

    8 bii

    adr.A+4

    18Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 17/66

    Aritmetica pointerilor (continuare)

    > Exemplu 2 (continuare)

    adr.A

    8 bii

    adr.A+1

    8 bii

    p

    x

    8 bii 8 bii

    adr.A+2 adr.A+3

    p++

    10

    adr.A+4

    > Teoretic, *(p++)=10 se traduce prin:

    - p nu mai are ca valoare adresa lui x (adr. A) ci p++, ianume adresa p+4bytes (adr.A+4).

    - la adresa stocat la adr.A+4 se va pune valoarea 10.

    > Practicam omis faptul c p++ este o incrementare post:

    - la adresa stocat n p se va pune valoarea 10.

    - dup aceasta, p este incrementat i indic adr.A+4.

  • 8/8/2019 Programarea Calculatoarelor M8

    4/12

    int *p, x=15;p=&x;(*p)++;

    adr.A adr.B

    p x

    adr.B 15+1

    adr.A adr.B

    p x

    adr.A ad