Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 06. 03. 2012 18:36 — Editoval RePRO (06. 03. 2012 18:39)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Rozdíl mezi referencí (&) a dereferencí (*) – C++

Zdravím,
mohl by mi někdo vysvětlit rozdíl mezi těmito třemi funkcemi?
(funkce jsou zde).
Programuji už léta, vždy jsem využil dereferenci. Ovšem, tady jsou tři funkce a v parametrech je jak reference (&) a dereference (*). Návratové hodnoty jsem taky změnil.
Všechno mi šlo přeložit (IDE: Microsoft Visual C++).

Vždycky jsem měl problémy, co se může dávat za parametry, takže to shrnu:

Pokud máme proměnnou dereferenci: *ukazatel
1) funkce(*prom) – dáváme: funkce(ukazatel)
2) funkce(&prom) – dáváme: funkce(*ukazatel)

Pokud máme proměnnou klasiku: klasika
1) funkce(*prom) – dáváme: funkce(&klasika)
2) funkce(&prom) – dáváme: funkce(klasika)

Nebo jsou i jiné možnosti, nebo se mýlím?

Moje otázky
1) Jaký je tedy rozdíl mezi referencí a dereferencí? Přijde mi to analogické.
Jakožto reference je adresa proměnné, dereference je též adresa proměnné, akorát na ní směřuje ukazatel.
2) Jaký je základní rozdíl mezi druhou a třetí funkcí?

Doufám, že si už v tom udělám absolutní jasno, i když ho mám, ale ne zcela úplné. Dobrý programátor toto prostě musí umět dokonale – práce s pamětí.
Díky.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#2 07. 03. 2012 12:47

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Rozdíl mezi referencí (&) a dereferencí (*) – C++

Zdar,

já jsem referenci (volání s předáním reference) taky snad nikdy nepoužil, vždycky jsem si poradil skrz ukazatele, když jsem potřeboval předat buď pole, strukturu nebo objekt, a  nebo "původní" proměnnou, ne její kopii, ale co jsem se kdysi dávno učil, tak předání reference jde jen v C++ a používá se to proto, aby se dalo pokud možno vyhnout ukazatelům tam, kde nejsou úplně potřeba.

Podle mně je to dvojsečná možnost, když předám ukazatel, vím, že se mi můžou předané argumenty změnit, když předávám referenci, předávám "původní" proměnnou jak je, a nijak ze čtení kódu poznat, že nepracuju s kopií a že se mi může a bude (udělám-li tak úmyslně nebo chybu) měnit....

Ale zpět k tématu - ono předání referencí je předání proměnné, ze které se v okamžiku volání automaticky stane ukazatel, a který se pak při práci zase automaticky dereferencuje a pracuje se s předanou proměnnou jako s proměnnou (ty označuješ "klasika"). Jinak jsou reference a ukazatele ekvivalentní - když předáš ukazatel, předáš adresu, když předáš referenci, předáš taky adresu, jen s tím rozdílem, že se ti bude automaticky dereferencovat.

Doporučuji na toto téma si vypůjčit (pokud nevlastníš, což ti mohu jen doporučit) Mistrovství v C++ od Praty, já mám II. vydání v češtině, toto téma je dobře vysvětlené i s příklady na straně 302 a následující. (celkově je to velmi dobré dílo, doporučuji zakoupit)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#3 07. 03. 2012 12:53

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Rozdíl mezi referencí (&) a dereferencí (*) – C++

Díky, mám podobné názory.
Ještě jsem dočetl, že rozdíl mezi "*" a "&" je pouze syntaktický, uvnitř to pracuje stejně, v obou je pointer. Rozdíl je hlavně v tom, že "&" nejde měnit a obtížně se do něho dostává NULL, kdežto "*" jde změnit kdykoliv (pokud není const) a snadno se do něho vrazí NULL.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson