Close
Duke shfaqur rezultatin -9 deri 0 prej 2
  1. #1
    i/e regjistruar
    Anëtarësuar
    22-03-2008
    Postime
    1

    C: Çfarë janë treguesit (Pointers)?

    Programimi Ne C

    Mirembrema te gjitheve, jam nje student ne itali dhe studioj informatike.
    Po merrem me programim ne c, por nuk po kuptoj mire c'eshte nje puntator dhe per cfare sherben?
    Ju lutem me ndihmon njeri sepse tani kam dhe provimin.

    FALEMINDERIT
    Ndryshuar për herë të fundit nga edspace : 23-03-2008 më 17:24

  2. #2
    Programues Softueresh Maska e edspace
    Anëtarësuar
    04-04-2002
    Vendndodhja
    Filadelfia, SHBA
    Postime
    2,565
    Për të kuptuar si punojnë treguesit, duhet të kuptosh më parë si programet lexojnë dhe shkruajnë në kujtesë (memory).


    Kujtesa

    Mendoje kujtesën si një seri fushash, ku çdo fushë ka një adresë dhe një vlerë, si në shembullin më poshtë:

    Kodi:
    
    Adresa  Vlera
    00001   12
    ...     ...
    00012   F
    00013   O
    00014   R
    00015   U
    00016   M
    00017   I
    ...     ...
    00028   365
    ...     ...
    Mund të shikojmë më lart se në fushën me adresë 00001 është ruajtur vlera 12; nga adresa 00012 deri në adresën 00017 është ruajtur fjala FORUMI, e kështu me radhë. Kuptohet që këto vlera ruhen në sistemin binar (01) por unë kam përdorur numra dhjetor dhe shkronja sepse ato u interesojnë njerëzve/programuesve.

    Tani që kemi një ide të thjeshtuar se si prezantohet kujtesa, le të shikojmë se si i shkruajmë dhe lexojmë vlerat prej saj.


    Ndyshoret (Variables)

    Për të thjeshtësuar ruajtjen dhe leximin e kujtesës, gjuhët programuese na lejojnë që të emërtojmë një nga fushat e kujtesës me një ndryshore. Për shembull, për të mos iu referuar numrit 12 me adresën 00001, krijojmë një ndryshore me një emër të lehtë për të mbajtur mend dhe kuptimplotë, si NR_MUAJVE.

    Kur krijojmë një ndryshore, i japim kompjuterit tre argumente:

    1. tipin e vlerës si psh: int, short, long, float, double, char, bool, etj.
    2. emrin e ndryshores (psh: x, y, i, teDhenat, rezultati, shuma)
    3. vlerën fillestare

    Nëse nuk caktojmë një vlerë fillestare, kompjuteri mund të caktojë një vlerë të parazgjedhur (0, null, '\0') ose një vlerë të çfarëdoshme.

    Duke vazhduar me shembullin e mësipërm, krijojmë tre ndryshore në gjuhën C:

    Kodi:
    const int NR_MUAJVE = 12; 
    const char forumi[] = "FORUMI"; 
    const int DITE_NE_VIT = 365;
    Me kodin e mësipërm, i themi kompjuterit që vlera e fushës 00001 quhet NR_MUAJVE, fusha 00012 ka emrin forumi[] dhe fusha 00028 ka emrin DITE_NE_VIT.

    Pra, duke përdorur ndryshoret, kemi shmangur adresat e vështira për t'u mbajtur mend dhe kemi krijuar një lidhje direkte me vlerat:

    Kodi:
    Ndryshorja   Vlera
    NR_MUAJVE       12
    forumi[]        FORUMI
    DITE_NE_VIT     365
    Tashmë që kemi të qarta se si përdoret kujtesa dhe ndryshoret, le të hidhemi tek treguesit.


    Treguesit (Pointers)

    Treguesit janë ndryshore speciale, vlera e të cilave është adresa e një fushe të kujtesës. Pra, ata quhen tregues sepse na tregojnë adresën e një fushë të caktuar të kujtesës. Vlera e ndryshores është një vlerë ndërsa vlera e treguesit është një adresë e kujtesës. Nëse bëjmë një analogji me shtëpitë dhe adresat e tyre, ndryshorja është shtëpia, ndërsa treguesi është adresa e shtëpisë.

    Le të vazhdojmë me shembullin e mësipërm dhe të shtojmë tre tregues për ndryshoret ekzistuese:

    Kodi:
      const int NR_MUAJVE = 12; 
      const char forumi[] = "FORUMI"; 
      const int DITE_NE_VIT = 365;
    
      printf("%d\t%s\t%d\n", NR_MUAJVE, forumi, DITE_NE_VIT); 
    
      const int * trg_nr_muajve = &NR_MUAJVE; 
      const char * trg_forumi = forumi; 
      const int * trg_dite_ne_vit = &DITE_NE_VIT; 
    
      printf("%d\t%d\t%d\n", trg_nr_muajve, trg_forumi, trg_dite_ne_vit);

    Nëse ekzekutojmë kodin me lart, rezultati do jetë:

    Kodi:
    12    FORUMI    365
    00001    00012    00028
    Çfarë ndodhi? Kur printuam ndryshoret, dolën vlerat e ndryshoreve, ndërsa kur printuam treguesit, dolën adresat e fushave të kujtesës. Pra, bëjmë lidhjen:

    Kodi:
    
    TREGUESI        = ADRESA  ----> NDRYSHORJA    = VLERA
    trg_nr_muajve   = 00001   ----> NR_MUAJVE     = 12
    trg_forumi      = 00012   ----> forumi        = "FORUMI"
    trg_dite_ne_vit = 00028   ----> DITE_NE_VIT   = 365
    Për të deklaruar një tregues, përdorim sintaksë të ngjashme me atë të ndryshoreve, por midis tipit të të dhënave dhe emrit vendosim një yll (*) i cili i tregon përpiluesit (kompiler) se ky është një tregues, jo një ndryshore e thjeshtë.


    Si të lexosh treguesit

    Për të lexuar deklarimet e treguesve, lexo më parë pjesën në të djathtë të yllit (*), pastaj lexo yllin si "tregon/tregues", pastaj lexo pjesë në të majtë të yllit.

    Psh:
    shkruhet: int * x
    lexohet: x tregon një int

    shkruhet: const int * x
    lexohet: x tregon një const int. Pra, x tregon në një int të pandryshueshëm.

    shkruhet: int * const x
    lexohet: const x tregon një int. Pra, x është një tregues i pandryshueshëm që tregon në një int.

    shkruhet: const int * const x
    lexohet: const x tregon një const int. Pra, x është një tregues i pandryshueshëm që tregon në një int të pandryshueshëm.

    shkruhet: int * * x
    lexohet: x tregon një tregues int * që tregon një int


    ...

    Besoj se kam qënë i qartë në ato sa kam shpjeguar. Treguesit janë një nga temat më të vështira të gjuhëve C dhe C++ për të kuptuar dhe përdorur siç duhet, jo vetëm për fillestarët, por edhe për ekspertët. Prandaj, duhet t'u kushtosh kohë e t'i studiosh prej themeleve.

    Do e vazhdoj nesër leksionin për të treguar se si inicializohen treguesit, pse dhe kur përdoren, ndryshimin midis treguesve dhe matricave, etj.
    Ndryshuar për herë të fundit nga edspace : 24-03-2008 më 02:11
    Edi

Tema të Ngjashme

  1. Kompanite dhe Investitoret..!!
    Nga Zemrushja në forumin Ekonomi & biznes
    Përgjigje: 57
    Postimi i Fundit: 03-04-2008, 11:45

Regullat e Postimit

  • Ju nuk mund të hapni tema të reja.
  • Ju nuk mund të postoni në tema.
  • Ju nuk mund të bashkëngjitni skedarë.
  • Ju nuk mund të ndryshoni postimet tuaja.
  •