Lich555 Temat założony przez niniejszego użytkownika |
Wskaźniki i referencję - wieczny problem » 2016-09-27 21:46:10 Witam. Próba załagodzenia sytuacji: Zapewne po przeczytaniu tematu krew w Was zawrzała. Niestety w większości tematach ludzie nie tłumaczą tego w prosty i przejrzysty sposób. Moje domysły: Referencja, rozumiem, że jest to nadanie zmiennej innej nazwy. Pracując na referencji danej zmiennej tak naprawdę pracujemy na tej zmiennej. Można m.in. przesyłać oryginał zmiennych do innych funkcji. Wskaźników użyjemy m.in. do dynamicznej alokacji tablicy. Pytanie: Jaka jest praktyczna różnica między wskaźnikami, a referencjami? |
|
carlosmay |
» 2016-09-28 00:03:05 Referencja, w praktyce to stały wskaźnik. Raz ustawiona nie może zmienić przechowywanego adresu oraz nie można wykonać na niej arytmetyki jak na wskaźnikach. |
|
latajacaryba |
» 2016-09-28 00:11:46 Nie chcę Cię wprowadzić w błąd, wiem jak to działa ale nie wiem czym dokładnie to jest. Carlos Ci odpowiedział, on wie lepiej. Ale masz tu link do kursu o referencji jakbyś nie zrozumiał czy coś : http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Przekazywanie-argumentow-funkcji-przez-referencje/356 |
|
kmlkamilek |
» 2016-09-28 02:14:34 Referencja - odwołuje się do danej komórki pamięci Wskaźnik - przechowuje indeks danej komórki pamięci Na szybko napisałem mały kod, żebyś poznał podstawy działania tych tworów. #include <iostream>
int main() { int x = 32; int * pointer = & x; int & reference = x; std::cout << "Wartość x po zwiększeniu o 1: " << ++x << std::endl; std::cout << "Wartość x po zwiększeniu o 1 używając referencji: " << ++reference << std::endl; std::cout << "Adres zmiennej x: " << pointer << std::endl; std::cout << "Wartość x po zwiększeniu o 1 używając wskaźnika: " << ++* pointer << std::endl; int y = 15; reference = y; std::cout << "Zmienna reference, przechowuje teraz odwołanie do zminnej y" << std::endl; std::cout << "Wartość zmiennej, do której odwołuje się reference zwiększona o 1: " << ++reference << std::endl; const int & reference_to_const = & y; std::cout << "Utworzyliśmy teraz kolejną zmienną przechowującą odwołanie do stałej" << std::endl; return 0; }
|
|
mateczek |
» 2016-09-28 18:59:03 referencja, odniesienie, alias. referencją posługujemy się tak samo jak zwykłą zmienną. Tak jak ksywką w stosunku do kumpla. Czy używamy ksywki, czy prawdziwego imienia chodzi o tego samego kumpla. Podczas gdy wskaźnik to adres w pamięci, z pod którego możemy coś wyłuskać. To kompilator odpowiednio interpretuje kod. |
|
kmlkamilek |
» 2016-09-28 23:32:12 @mateczek [...]natomiast jeśli do wskaźnika wpiszemy 3 (jak się mocno postaramy to pewnie się uda:P) to kompilator nada wskaźnikowi wartość 3. Od tej pory wskaźnik będzie pokazywał po prostu 3 komórkę pamięci |
Jakoś mocno nie trzeba się starać. :P int * p = reinterpret_cast < int *>( 0x3 ); @Alueril - w takim razie usuwam bzdety, co by ich nie rozpowszechniać. Na drugi raz postaram się bardziej o rzetelność informacji. :P |
|
Elaine |
» 2016-09-29 00:42:13 jest możliwość, że nieszczęśliwie trafimy, na adresik, który jest już zarezerwowany przez inny proces |
Powszechnie używane systemy operacyjne tak nie działają. |
|
karambaHZP |
» 2016-09-29 13:47:27 Referencja, rozumiem, że jest to nadanie zmiennej innej nazwy. |
Można tak to rozumieć, ponieważ referencja "przejmuje" cechy obiektu do którego ma adres. Dzięki temu składniowo odpowiada oryginalnemu obiektowi. Referencji najczęściej używamy, gdy odwołujemy się do konkretnego obiektu, ale nie chcemy go kopiować, bo operacja kopiowania może być zbyt kosztowna. Zresztą obecnie przyjętą konwencją jest const & zamiast kopii. Wskaźnik działa na adresach. Może zmieniać adresy obiektów, na które wskazuje, przesuwać się oraz udostępnia arytmetykę (na podstawie typu). Jeśli chcemy odwołać się do wartości, spod adresu na jaki wskazuje wskaźnik, musimy skorzystać z operatorów dereferncji. |
|
« 1 » |