Rodykles C kalboje

Žinutė
Autorius
Vartotojo avataras
Dreigons
rašytojas profesionalas
rašytojas profesionalas
Pranešimai:364
Užsiregistravo:2006 01 18 13:11
Miestas:Kursenai
Rodykles C kalboje

#1 Standartinė Dreigons » 2006 08 01 15:34

Tai va mokinuos c++ kalba. Turiu knyga "C++ ir C++ Builder pradmenys"
Tai vat noreciau suzinoti kam jie naudojami ir pns. Nes knygoje toje temoje man visiskai juodas miskas.
Pvz
int *a; //Sukuriamas sveikojo tipo rodykle
I = *a //Priskiriama rodykles a nurodama reiksme
int *p, y; //Atitinka: int *p; int y;
Arba rodykliu aprasymo pavyzdys:
int *a, b = 25, *p = &b;
Gal kas galit paaiskint apie siuos dalykus placiau? Nes is knygos man bent jau nieko neina suprast, net ju paskirties...
Neseniai skaiciau komentarus apie sia knyga ir tie komentarai nepagirtini...
Paskutinį kartą redagavo Dreigons 2006 08 01 23:47, redaguota 1 kartą(us).

brain5ide
profesionalas
profesionalas
Pranešimai:2030
Užsiregistravo:2004 12 01 19:05

#2 Standartinė brain5ide » 2006 08 01 18:55

Ta knyga tikras mėšlas, pradedant mokytis. Vos suprasdamas anglų kalbą iš angliškų šaltinių supratau daugiau, negu iš tos knygos.

Taigi, važiuojam:
Rodyklė - tai toks duomenų tipas, kuriame saugomi atminties adresai.
Sukuriam rodyklę ir du kintamuosius:

Kodas: Pasirinkti visus

int *c;
int a,b;
Dabar turime 4 baitų dydžio kintamąjį(visos rodyklės x86 sistemoje yra 4 baitu dydzio, kadangi tokie adresai).
Dabar priskiriam kintamiesiems reiksmes, o rodyklei priskiriam kintamojo a adresa.

Kodas: Pasirinkti visus

a = 1;
b = 2;
c = &a;
& - c kalboje yra adreso operatorius. Tai reiskia, kad vietoje pacio kintamojo reiksmės rodomas kintamojo adresas atmintyje.

Dabar kintamojo a reiksme yra 1, kintamojo b reiksme yra 2, o rodykle c rodo į kintamaji a. Tai reiskia, kad kreipdamiesi i rodykle mes pasieksim ta pati adresa, kaip ir kintamasis a. Taigi nuo sio momento kode vietoje kintamojo a galima rasyti *c .

Kodas: Pasirinkti visus

*c = 3;
Čia * yra netiesioginio duomenų perdavimo operatorius. Jis reiskia, kad kreipiamės ne į pačią rodyklę, į tą adresą, kuris saugomas rodyklėje.

Taigi dabar kintamojo a reikšmė yra 3, kintamojo b reikšmė yra 2, o rodyklė teberodo į kintamąjį a.

Kodas: Pasirinkti visus

c = &b;
Dabar rodyklė rodo į kintamąjį b, ir vietoje b galime rašyti *c. Trumpiau ir vaizdžiau sakant, rodyklės yra kaip "shortcut'ai" ant windows desktop'o, t.y. daug rodyklių, su skirtingais pavadinimais gali būti nukreiptos į vieną ir tą patį failą.

Kam reikalingos rodyklės?
Programuojant paprastas programas jų nereikia, tačiau kuriant sudėtingas programas rodyklės labai praverčia. Naudojantis jomis, galima greitai perduoti didelius duomenis iš vienos funkcijos į kitą. Yprastai iškviečiant funkciją, jai perduodant argumentus, jai perduodamos tik reikšmės. Funkcija pati susikuria reikiamus kintamuosius ir juose išsaugo tas reikšmes. Vadinasi, naudojama papildoma atmintis, ir duomenys nukopijuojami į ją. Kai duomenų kiekiai maži, neatsitinka nieko baisaus, tačiau kai reikia perduodi didelius duomenis, atmintis pradeda stabdyti. Todėl, užuot perduodami didelius duomenų kiekius, programuotojai naudojasi rodyklėmis. Vietoje tūkstančio sveikųjų skaičių, perduodami viso labo 4 baitai, o funkcija gali naudotis reikiamais duomenimis. Rodyklės ypač svarbios, naudojant masyvus, bet apie tai vėliau. Rodyklės taip pat naudojamos funkcijoms, kurios turi manipuliuoti duomenimis(pvz. rikiavimo funkcijos). Tarkime kuriame duomenų rikiavimo sistemą. Yra funkcijos, kurios pagal kokį nors algoritmą nurodo, kokias reikšmes reikia sukeisti vietomis, o jums reikia parašyti funkciją, kuri tas reikšmes sukeis. Tarkime jūs rašote tokią funkciją:

Kodas: Pasirinkti visus

function keisk(int a,  int b)
{
int buf;
buf = b;
b = a;
a = buf;
}
Tokią funkciją iškviesime šitaip:

Kodas: Pasirinkti visus

keisk(a,b);
Tačiau, jinai kintamųjų realiai nesukeis. Ji tiesiog sukeis jų kopijas. Na o dabar parašykime pavyzdį pasinaudodami rodyklėmis:

Kodas: Pasirinkti visus

function keisk(int *a, int *b)
{
int buf;
buf = *b;
*b = *a;
*a = buf;
}
Tokia funkcija sukeis mums reikiamus kintamuosius vietomis, tačiau jai reikės perduoti kintamųjų adresus:

Kodas: Pasirinkti visus

keisk(&a,&b);
Dabar, perduodant funkcijai adresus, ji gali tiesiogiai prieiti prie jai reikiamų duomenų ir jais manipuliuoti.
Never argue with an idiot. They bring you down to their level and beat you with experience.

Vartotojo avataras
GODhack
profesionalas
profesionalas
Pranešimai:4469
Užsiregistravo:2005 03 18 21:13
Susisiekti:

#3 Standartinė GODhack » 2006 08 01 19:05

:shock: brain5ide, negalvojau kad tep moki dar kokia nors kalba be paskalio. Nustebinai mane. :)
Nepatikti blogiems - girtinas dalykas. SENEKA
__________________________________________
progenic.com
library.2ya.com
Paveikslėlis

brain5ide
profesionalas
profesionalas
Pranešimai:2030
Užsiregistravo:2004 12 01 19:05

#4 Standartinė brain5ide » 2006 08 01 19:31

Rodyklės ir masyvai
Rodyklės ir masyvai C kalboje labai susiję, kadangi masyvo reikšmes C kalba pasieka pasinaudodama būtent rodyklėmis.
Sukurkime masyvą:

Kodas: Pasirinkti visus

int mas[10];
Taigi, dabar atmintyje yra išskirta vietos dešimčiai int tipo kintamųjų(masyvo elementas yra tolygus kintamąjam). Masyvo pavadinimas, be laužtinių skliaustų yra rodyklė į pirmąjį masyvo kintamąjį. T.y. norėdami pasiekti pirmąjį masyvo elementą rašome *mas arba mas[0]. Visus sekančius masyvo vienetus C kompiliatorius pasiekia naudodamasis masyvo pradžios rodykle, prie jos pridėdamas atitinkamą skaičių. Pačios masyvo pradžios rodyklės(masvyo pavadinimo be laužtinių skliaustų, šiuo atveju mas) keisti negalima, todėl sukurkime papildomą rodyklę, kurią galėsime redaguoti, ir jai priskirkime masyvo pradžios adresą.

Kodas: Pasirinkti visus

int *a;
a = mas;
Taigi dabar pirmąjį masyvo elementą galime pasiekti trimis vardais: mas, mas[0], *a. Norėdami, kad rodyklė rodytų į sekantį masyvo elementą, prie jos paprasčiausiai pridedame vienetą.

Kodas: Pasirinkti visus

a += 1;
Dabar rodyklė rodo į antrąjį masyvo elementą mas[1]. Taigi tarp masyvo elementų taip ir šokinėjam pridėdami prie rodyklės, arba atimdami iš jos.
Pastaba:Norint, kad eitų šokinėti tarp masyvo elementų, rodyklės ir masyvo duomenų tipas turi sutapti, t.y. jeigu masyvas yra int, tai ir rodyklė turi būti int, kadangi skirtingi duomenų tipai užimą skirtingą atminties kiekį.
Pastaba:Peršokdami už masyvo ribų pasiekiame kažkokius kitus duomenis. Kartais tai bus kiti kintamieji, kartais - pačios programos instrukcijos ir pan.(priklausomai nuo to, kiek pažeisime masyvo ribas). Kuriant programas būtina apriboti, kad rodyklė neišeitų už masyvo ribų, kadangi pasinaudojus atitinkamu kodu(liaudyje vadinamu exploitais) būtų galima pasiekti buffer overflow ataką, kurios padariniai gali būti įvairūs.
Never argue with an idiot. They bring you down to their level and beat you with experience.

brain5ide
profesionalas
profesionalas
Pranešimai:2030
Užsiregistravo:2004 12 01 19:05

#5 Standartinė brain5ide » 2006 08 01 19:32

GODhack rašė::shock: brain5ide, negalvojau kad tep moki dar kokia nors kalba be paskalio. Nustebinai mane. :)
GODhack, aš paskalio nemoku :) Mokykloj liepia, o aš protestuoju :D Mano vienas klasiokas buvo su viena mokytoja susikoliojęs, nes jis irgi paskalio nenori mokytis. Mokytoją taip išvedėm iš rikiuotės, kad leptelėjo, jog C yra sukurta pagal paskalį :D
Never argue with an idiot. They bring you down to their level and beat you with experience.

Vartotojo avataras
Dreigons
rašytojas profesionalas
rašytojas profesionalas
Pranešimai:364
Užsiregistravo:2006 01 18 13:11
Miestas:Kursenai

#6 Standartinė Dreigons » 2006 08 01 23:15

brain5side didelis dekui. :)
Dabar mazdaug supratau, dar ryte reiks perskaityt karta ir bus viskas ore. :)
Nes db galva muzono pripumpoto...

P.S. Galetum ir knygas rasyt! 8)

brain5ide
profesionalas
profesionalas
Pranešimai:2030
Užsiregistravo:2004 12 01 19:05

#7 Standartinė brain5ide » 2006 08 01 23:21

Beje, Dreigons, temos pavadinimą pakeisk. Čia kalbėjom apie rodykles C kalboje. Išvestiniai duomenų tipai visai kas kita. Tai duomenų struktūros.
Never argue with an idiot. They bring you down to their level and beat you with experience.

Vartotojo avataras
Dreigons
rašytojas profesionalas
rašytojas profesionalas
Pranešimai:364
Užsiregistravo:2006 01 18 13:11
Miestas:Kursenai

#8 Standartinė Dreigons » 2006 08 01 23:50

Nu cia idomiai. :roll:
Knygos tema "Isvestiniu tipu sudarymo priemones" kurioje tos rodykles aprasomos :lol:
Nu joa ta knyga nei puse savo kainos neverta *224*

brain5ide
profesionalas
profesionalas
Pranešimai:2030
Užsiregistravo:2004 12 01 19:05

#9 Standartinė brain5ide » 2006 08 02 00:01

Dabar pats atsiverčiau tą knygą. Čia būtent paaiškina apie rodykles, o po to aiškina apie išvestinius tipus(masyvus, funkcijas, dar toliau ir struktūras). Šiaip Blonskis tiesiog nemoka dalyko paprastai paaiškinti. Ir apksritai, lietuvių autorių knygos apie programavimą labiau primena mokslinius darbus. Nors ir parašyta pradedantiesiems. Turiu dar A.Vidžiūno knygą apie Delphi 6. Irgi kažkas panašaus. Greičiau mokykis anglų/rusų kalbas. Taip tikrai paprasčiau bus siurbti informaciją.
Never argue with an idiot. They bring you down to their level and beat you with experience.

Vartotojo avataras
GODhack
profesionalas
profesionalas
Pranešimai:4469
Užsiregistravo:2005 03 18 21:13
Susisiekti:

#10 Standartinė GODhack » 2006 08 02 00:21

Bet uzsienio kalba irgi blogai, nes sunkiai skaitosi, dvigubai apmastyt reikia pirma kol i lietuviu galvoj isverti ir paskui dar kol pati turini isisavini.

O kai toj knygoj tai gi ne kokiai mokyklai kali: ko nesupranti praleidi, o paskui kai daugiau ziniu turesi tai sugrysi.

Kai va puslapi parasai tai viskas aisku, o rasant dideles knygas begalo sunku islaikyti ta testinuma, kad nereiktu zinot to kas paskui bus pasakyta tam, kad suprast dabartinius pusl.
Nepatikti blogiems - girtinas dalykas. SENEKA
__________________________________________
progenic.com
library.2ya.com
Paveikslėlis

Vartotojo avataras
Trolis gumis
Crowbar Master
Pranešimai:1980
Užsiregistravo:2003 07 19 14:23

#11 Standartinė Trolis gumis » 2006 08 02 00:34

as tai pvz kai skaitau angliskai, iskart kazkaip ir galvojasi angliskai galvoj ir tiesiog taip ir supranti, net mintyse i lietuviu neversdamas. Ir ne romana skaitau, o mokomaja knyga apie 3D max. pradzioj buvo sunkiau su terminais, bet siek tiek su programa padirbus pasidare aisku ir skaityt tapo dar lengviau.

Vartotojo avataras
Dreigons
rašytojas profesionalas
rašytojas profesionalas
Pranešimai:364
Užsiregistravo:2006 01 18 13:11
Miestas:Kursenai

#12 Standartinė Dreigons » 2006 08 02 10:14

As kai skaitau paprasta EN knyga tai beveik viska normaliai suprantu. Kur buna tokiu nesuprantamu zodziu tiesiog pagal sakyni juos issiverciu.
Bet siaip as dar nelabai turiu pakankamai en ziniu kad galeciau skaityti knygas apie c++. O siaip toi LT knygoi daugiau ziuriu i pvz (nors ju nevisalaik yra) ir juos nagrineju. Taip man lengviau nei En knyga skaityti :D

Vartotojo avataras
Lioniax
ultra dalyvis
ultra dalyvis
Pranešimai:596
Užsiregistravo:2005 09 21 13:25

#13 Standartinė Lioniax » 2006 08 02 22:56

brain5ide rašė:...Šiaip Blonskis tiesiog nemoka dalyko paprastai paaiškinti..
Svelniai tariant...
Mūsų darbas tamsoje -
Mes darome tai, ką mokam,
Atiduodame tai, ką mokam,
Mūsų darbas - tamsoje.
Abejonės virto aistra,
Aistra gi - ištirpo laisvėje.
Visa kita - menas
Išlikt savim beprotybėje.

brain5ide
profesionalas
profesionalas
Pranešimai:2030
Užsiregistravo:2004 12 01 19:05

#14 Standartinė brain5ide » 2006 08 02 23:08

Lionax, pala, ar tu tik ne KTU studijuoji? Gal kaip tik Blonskis ir dėsto? :D

P.S. Gal ir klystu.
Never argue with an idiot. They bring you down to their level and beat you with experience.

Vartotojo avataras
Dreigons
rašytojas profesionalas
rašytojas profesionalas
Pranešimai:364
Užsiregistravo:2006 01 18 13:11
Miestas:Kursenai

#15 Standartinė Dreigons » 2006 08 02 23:08

Bet ten ta knyga parase kazkoks Antanas Vidziunas :lol:

Skelbti atsakymą

Grįžti į

Dabar prisijungę

Vartotojai naršantys šį forumą: 2 ir 0 svečių