Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wskaźniki i referencję - wieczny problem

Ostatnio zmodyfikowano 2016-09-29 13:47
Autor Wiadomość
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?
P-152075
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.
P-152077
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
P-152078
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.

C/C++
#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;
    // ++reference_to_const; Błąd!!! Mimo, że odwołujemy się do zmiennej,
    // dekarując odwołanie do stałej, odwołanie zachowa się, jakby to do czego się odwoływało było stałą.
   
    return 0;
}
P-152079
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.

C/C++
int a;
int & b = & a
// o tej pory do zmiennej a można się odwołać w na dwa sposoby a=3 b=6 gdyż "b" jest aliasem zmiennej "a"

//oczywiście, że wszystko to adresy  zarówno "a" i "b". Ale kompilator widząc zapis b=3; wpisze pod nieznany programiście adres w pamięci wartość 3.
//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 [/code]
P-152091
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
P-152100
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ą.
P-152102
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.
P-152104
« 1 »
  Strona 1 z 1