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
Stránky: 1
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.
Offline

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)
Offline
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.
Offline
Stránky: 1