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

przewaga referencji wskaźnika od zwykłego wskaźnika

Ostatnio zmodyfikowano 2013-06-25 19:30
Autor Wiadomość
Savail
Temat założony przez niniejszego użytkownika
przewaga referencji wskaźnika od zwykłego wskaźnika
» 2013-06-25 18:33:15
Hej,
Do tej pory myślałem, że nie ma praktycznej różnicy między referencją wskaźnika: (Typ *&) a zwykłym wskaźnikiem (Typ *).

Przeprowadziłem parę testów danego kodu:
C/C++
#include <iostream>

using namespace std;
void funkcja( int * liczba )
{
    int a = 1;
    liczba = & a;
}

int main()
{
    int * wskaznik = 0;
    funkcja( wskaznik );
    cout <<* wskaznik;
}

I okazuje się że aby zmienić wartość wskaźnika przekazywanego do funkcji jako parametr, to ten parametr musi być referencją do wskaźnika, czyli:
void funkcja( int * & liczba )
. Może ktoś to potwierdzić i napisać czemu zwykły wskaźnik w parametrze powoduje błąd dostępu pamięci(nie zostanie do niego przypisana żadna wartość)? Wydawało mi się oczywiste, że zwykły wskaźnik powinien też działać ale jednak tak nie jest... chyba że coś źle robię?
P-86165
pekfos
» 2013-06-25 18:53:58
1. (próbujesz) przekazać poza funkcję adres zmiennej lokalnej
2. Przekazujesz wskaźnik przez wartość, więc sam wskaźnik modyfikujesz lokalnie.
P-86170
Savail
Temat założony przez niniejszego użytkownika
» 2013-06-25 18:58:58
Rzeczywiście, z pośpiechu mi się tak napisało tą funkcję.(Pierwotna, z której wyniosłem ten błąd nie jest tak bez sensu :P).

Jednak teraz taki kod nie powinien powodować błędu a nadal to samo się dzieje:
C/C++
#include <iostream>

using namespace std;

int a = 1;

void funkcja( int * liczba )
{
    liczba = & a;
}

int main()
{
    int * wskaznik = 0;
    funkcja( wskaznik );
    cout <<* wskaznik;
    return 0;
}
P-86171
pekfos
» 2013-06-25 19:22:55
Patrz drugi punkt z mojego postu.
P-86174
Savail
Temat założony przez niniejszego użytkownika
» 2013-06-25 19:30:19
Ok dzięki, już rozumiem. Dziwne, że dopiero teraz natknąłem się na to :P ale teraz to ma sens. Czyli musiałbym w tej funkcji zwrócić jeszcze ten wskaźnik i w main przypisać wynik funkcji do zmiennej wskaźnik aby przykład ze zwykłym wskaźnikiem działał:
C/C++
#include <iostream>

using namespace std;

int a = 1;

int * funkcja( int * liczba )
{
    liczba = & a;
    return liczba;
}

int main()
{
    int * wskaznik = 0;
    wskaznik = funkcja( wskaznik );
    cout <<* wskaznik;
    return 0;
}

Drugim rozwiązaniem jest przekazanie do funkcji referencji wskaźnika.
dzięki
P-86175
« 1 »
  Strona 1 z 1