Stránka: 1 z 1
| [ Príspevkov: 14 ] | |
| Autor | Správa |
|---|
Registrovaný: 07.04.07 Prihlásený: 10.08.10 Príspevky: 171 Témy: 42 | 42 Bydlisko: Bratislava |
Nazdar, potreboval by som trochu objasniť funkciu a aký je rozdiel medzi ukazovateľom a odkazom v C++. Akurát sa venujem štúdium a tato kapitola mi robí trochu zmätok v hlave. Tak by som bol vďačný za stručne vysvetlenie a objasnenie. Za pomoc Ďakujem.
_________________ Ten, kto sa pýta, je hlupákom päť minút; ten kto sa nepýta, zostáva hlupákom navždy. |
|
Registrovaný: 16.08.09 Prihlásený: 07.03.14 Príspevky: 186 Témy: 16 | 16 Bydlisko: Levice |
Pod odkazom máš na mysli referenciu asi.
Kód: int& i = a; Premenná i je referenciou na a. Akokoľvek narábaš s i, mení sa aj a. Premenná a musí mať l-hodnotu, to jest hodnota, ktorá je "istá", nejaký trvalý objekt. Kód: int b& = i; Prakticky neexistuje referencia na referenciu, lebo b je referencia na a. Pri funkciách máš 3 typy parametrov. Pokiaľ viem. Pr. Kód: int fcia(int premenna) {...} // prekopíruje sa hodnota premennej typu int do premennej premenná.
int fcia(int& premenna) {...} // vytvori sa referencia na argument, ktorý je predaný odkazom. Mení to hodnotu premennej, na ktorú je to referencia.
int fcia(const int& premenna) {...} // len na čítanie...
A čo také ti píšu v knihe, či z kadiaľ sa to učíš, čomu konkrétne nerozumieš?
_________________ "Najlepším spôsobom, ako sa na budúcnosť pripraviť, je vymyslieť si ju." - John Sculley |
|
Registrovaný: 16.08.09 Prihlásený: 07.03.14 Príspevky: 186 Témy: 16 | 16 Bydlisko: Levice |
Pointer vlastne reprezentuje adresu, nejakého objektu, napr. premennej.
Tu je to vidno, že po vypísaní pointera, vypíše adresu premennej a da sa to skontrolovať, keď adresu vypíšem pomocou adresového operátora.
Kód: #include <iostream>
int main () { int i = 0; int *p = &i; std::cout << p << std::endl; std::cout << &i << std::endl; return 0; }
_________________ "Najlepším spôsobom, ako sa na budúcnosť pripraviť, je vymyslieť si ju." - John Sculley |
|
Registrovaný: 07.04.07 Prihlásený: 10.08.10 Príspevky: 171 Témy: 42 | 42 Bydlisko: Bratislava |
Zobeme si ze mam nejaku funkciu napr. zmen_cisla
V hlavnej funkcii main si deklarujem a inicializuje dve premenne A a B ktorým priradim nejaku hodnotu napr 3 a 5. (su lokalne samozrejme)
A teraz chcem aby sa premenne A a B po zavolani funkcie zmena_cisla navysili napr. o 2 tak musim predat parametre funkcii ako odkaz nie ?
To znamena ze sa nepreda funkcii samotna hodnota ale adresa kde sa tieto dve premenna nachadzaju, vo funkcii sa zmenia hodnoty na tychto adresach ale samotne parametre (adresy a a b) predane funkcii sa nemenia. To v konecnom dosledku znamena ze dojde k zmene tychto cisel.
A to v globalnom ponati. Takze ked vypiseme premennu A a B v main bude ich hodnota zmenena.
A pritom niesme viazany oborom platnosti.
otazka : keby ze nepouzijem odkaz, cisla vo funkcii by sa zmenili ale zmena by sa neprejavila vo funkcii main, a to z toho dovodu ze zmena_cila(a,b) nepracuje primo s premennymi z funkcie main ale vytvara si ich kopie ktore meni, tie vsa po skonceni funkcie su mimo obor platnosti a to znamena ze spat vo funkcii main sa vypisu povodne hodnoty 3 a 5 a nie nove hodnoty navysene o 2.
Moja otaznka znie : je toto tvrdenie pravdive ? (chcem len vediet ci spravne chapem fungobvanie)
Kód: int main() { int a = 3; int b = 5; zmen_cisla(int &oa, int &ob); // sa navysi o 2 a aj b cout << a; // 5 cout << b; // 7 }
kod je iba ilustracny...
Toto je moja predstava o fungovani, otazka znie ci je tato predstava spravna  preto chcem aby ste ma opravili ak som povedal nejaku blbinu.
_________________ Ten, kto sa pýta, je hlupákom päť minút; ten kto sa nepýta, zostáva hlupákom navždy. |
|
Registrovaný: 11.01.09 Prihlásený: 01.05.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
tommy70777 píše: A teraz chcem aby sa premenne A a B po zavolani funkcie zmena_cisla navysili napr. o 2 tak musim predat parametre funkcii ako odkaz nie ? Ako odkaz alebo ako smerník - rozdiel je iba v používaní. Pri odkaze používaš pohodlne iba meno premennej, kdežto pri smerníku musíš použiť operátor referencie, teda hviezdičku *. tommy70777 píše: je toto tvrdenie pravdive ?
Presne, ako si napísal, chápeš tomu správne.
V tvojom kóde si umiestnil prototyp funkcie zmen_cisla do tela main-u, ale to si sa zrejme pomýlil. Ak chceš volať túto funkciu, tak takto:
Kód: zmen_cisla(a, b);
|
|
Registrovaný: 16.08.09 Prihlásený: 07.03.14 Príspevky: 186 Témy: 16 | 16 Bydlisko: Levice |
tommy70777 píše: Toto je moja predstava o fungovani, otazka znie ci je tato predstava spravna  preto chcem aby ste ma opravili ak som povedal nejaku blbinu.
Vyskúšaj, uvidíš, prečítaj si text viackrát, uvidíš, použi google uvidíš... 
_________________ "Najlepším spôsobom, ako sa na budúcnosť pripraviť, je vymyslieť si ju." - John Sculley |
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | 13 |
pizet píše: Pri funkciách máš 3 typy parametrov. Pokiaľ viem. Pr. Kód: int fcia(int premenna) {...} // prekopíruje sa hodnota premennej typu int do premennej premenná.
int fcia(int& premenna) {...} // vytvori sa referencia na argument, ktorý je predaný odkazom. Mení to hodnotu premennej, na ktorú je to referencia.
int fcia(const int& premenna) {...} // len na čítanie...
vazne?
_________________ Učet je neaktívny. |
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | 13 |
Fico píše: Ako odkaz alebo ako smerník - rozdiel je iba v používaní. Pri odkaze používaš pohodlne iba meno premennej, kdežto pri smerníku musíš použiť operátor referencie, teda hviezdičku *.
Je smutne, ze skuseny uzivatel tvrdi veci, ktore nie su pravda. Nechcem tu teraz rozoberat aky je rozdiel medzi pointerom a refenciou, pre zaciatocnika to asi nebude trivialne na pochopenie... Ale ved uz len z filozofie C++ je to blbost, kde nie sme v matejskej skolke a ked si mozeme nieco spravit sami, tak to nebude mat priamu podporu v jazyku...

_________________ Učet je neaktívny. |
|
Registrovaný: 08.03.09 Prihlásený: 17.01.25 Príspevky: 1116 Témy: 88 | 88 Bydlisko: 00100100 |
preco len kritizujes?! napis ked vies aby aj ostatny vedeli
_________________ Programming is The Best
Hackers Are Not Crackers!!! Hackers build things, crackers break them!
;-) |
|
Registrovaný: 11.01.09 Prihlásený: 01.05.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
ado21 píše: veci, ktore nie su pravda
Nevravím pravdu? Tak ma oprav. Inak ťa prosím, odpusť si tvoje narážky.
1.) tommy70777 sa danú problematiku učí, tzn, povedal som mu úplny základ, ktorý potrebuje na začiatok. Zložitejšie a hlbšie vysvetlenia by mu boli k ničomu.
2.) ak niečo neviem, tak do témy nepíšem
3.) ak nemáš čo poradiť, nespamuj (predpokladám, že nikoho nezaujíma "myslím si" a podobne. Takže keď spomínaš, že nevravím pravdu, nech sa páči, oprav ma a zbytočnosti tu nepíš. Veď, ako si povedal, "riadiš sa rozumom", však?)
|
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | 13 |
Fico píše: Nevravím pravdu? Tak ma oprav. Inak ťa prosím, odpusť si tvoje narážky.
1.) tommy70777 sa danú problematiku učí, tzn, povedal som mu úplny základ, ktorý potrebuje na začiatok. Zložitejšie a hlbšie vysvetlenia by mu boli k ničomu. 2.) ak niečo neviem, tak do témy nepíšem 3.) ak nemáš čo poradiť, nespamuj (predpokladám, že nikoho nezaujíma "myslím si" a podobne. Takže keď spomínaš, že nevravím pravdu, nech sa páči, oprav ma a zbytočnosti tu nepíš. Veď, ako si povedal, "riadiš sa rozumom", však?)
pointer je adresa v pamati, referencia je iba druhe meno pre ten objekt
- na refencii nemozes pouzit pointrovu aritmetiku.
- refercia nemoze odkazovat na void, pointer ano
- referncia na funkciu neexistuje, pointer na funkciu ano
- refenciu nemozes derefencovat
- refencia musi mat pri deklaracii rovno definovana
- neda sa zmenit objekt, na ktory refencia ukazuje. Stale ukaze iba na na jeden a ten isty objekt, ktory bol priradeny pri jej definicii
Nech sa na to divam akokolvek, vobec mi to nepride ako to iste a ani to nebol tvoj prvy preslap...
_________________ Učet je neaktívny. |
|
Registrovaný: 11.01.09 Prihlásený: 01.05.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
Teraz si všimni môj príspevok vyššie, nič z toho som nepoprel. Napísal som, že ak treba zmeniť premennú vo vnútri funkcie, tak sa tejto funkcii môže predať ako smerník alebo ako referencia. Ďalej som napísal, že pri referencii (odkaze) na premennú sa s ňou vo funkcii pracuje ako s obyčajnou premennou na rozdiel od smerníka, ktorý nesie adresu.
Myslím, že som bol "obvinený" neprávom a keďže som si všimol v iných sekciách fóra, že si hádavý typ človeka, ajj napriek JASNE vysvetlenému opaku, tak do tejto témy ďalej odmietam prispievať, keďže problém bol aj tak už vyriešený.
|
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | 13 |
Fico píše: Ďalej som napísal, že pri referencii (odkaze) na premennú sa s ňou vo funkcii pracuje ako s obyčajnou premennou na rozdiel od smerníka, ktorý nesie adresu. [/qoute] Neviem, naozaj nevidim, kde si take nieco napisal... Fico píše: Myslím, že som bol "obvinený" neprávom a keďže som si všimol v iných sekciách fóra, že si hádavý typ človeka, ajj napriek JASNE vysvetlenému opaku, tak do tejto témy ďalej odmietam prispievať, keďže problém bol aj tak už vyriešený.[/qoute] Studujem exaktne vedy, kde ma vyznam kazdy kvantifikator a kazde slovo. Aj zvratne zameno. V programovani duplom zalezi na kazdom znaku... Fico píše: Ako odkaz alebo ako smerník - rozdiel je iba v používaní.
Si to napisal a nie je to pravda. Nie som hadavy typ cloveka ale poznanie a pravdivost je u mna velmi vysoko... Co ak je problem ten, ze pouzivate slova iba tak, aby ste sa zamysleli, co nimi skutocne hovorite?
A naozaj si myslim, ze v takych veciach by nemal clovek veci, ktore skusenemu programatori ihned implikuju nepravdu...
A som alergicky ak nejaky clovek v role profika ide v exaktnych veciach vyhlasovat nepravdy. Aj vsetci blizko mna...
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
Staci. Tema sa zamyka, o odomknutie moze pripadne poziadat autor temy.
|
|
Stránka: 1 z 1
| [ Príspevkov: 14 ] | |
|