Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie] Wskaźniki i ... wskaźniki do wskaźników ?


Rekomendowane odpowiedzi

Opublikowano

Witam mam takie pytanie, otóż ostatnio próbuję zrobić listę dwukierunkową i natknąłem się na pewien problem. Mam zadeklarowany typ:

typedef struct pozycja
{
int liczba;
struct pozycja *nastepny, *poprzedni
}Pozycja;
typedef Pozycja* ppozycja;

i teraz, jak mam zadeklarowany w funkcji main()
ppozycja poczatek;
to i później przekazuje w funkcji DodajPozycje(ppozycja poczatek) ( wywoluje w funkcji main DodajPozycje (poczatek); )
to po wyjściu z funkcji nie zapisuje się, zupełnie jak zmienna automatyczna czy coś, chociaż wiem, że ma gdzieś tam swoje miejsce (funkcja malloc). I teraz czytając Prate natknąłem się na podobną funkcję, której deklaracja wygląda tak DodaPozycje (ppozycja *poczatek), a wywołanie w funkcji main (&poczatek)...
I teraz moje pytania: (Co tu się dzieje Wąski!! :D )
1. Czemu moje nie działało ( przecież dostało adres )
2. Po co przekazuje adres adresu ( gdyby mógłby mi ktoś to wytłumaczyć :) )
3. Czy to jest dereferencja wskaźników ( a jeśli nie to czy mógłby ktoś mi przybliżyć ten temat )
Opublikowano

Ogólnie nie bardzo rozumiem o co biega. W C, jeżeli chcesz mieć możliwość modyfikowania zmiennej, którą przekazujesz, korzystasz ze wskaźnika do tego.

//...
void nieModyfikuje(int a){
   a++;
}

void modyfikuje(int* a){
   *a++;//wyłuskanie w celu operacji na wartości, a nie na wskaźniku
}

int main()
{
    int liczba = 5;
    nieModyfikuje(liczba);
    //wydrukuj sobie czymś 
    modyfikuje(&liczba)//przekazanie adresu do wskaźnika
    //znowu sobie wydrukuj...
}

To może być powodem nie działania twojej funkcji tak jak trzeba.

 

2. Adres adresu? Hmm... może wskaźnik do wskaźnika?

int liczba = 5; // jakaś tam sobie randomowa wartość
int* wsk = &liczba; //wskaźnik pobierający adres zmiennej liczba
int** wsk2 = &wsk; //wskaźnik pobierający adres wskaźnika zawierający adres wskaźnika do liczba  

3. Dereferencja to prawdopodobnie wyłuskanie. Dla pewności zajrzałem do neta:

int liczba = 5; //taka se liczba
int* wsk = &liczba // wskaźnik pobierający adres do liczba
//nie kojarze, jak się drukuje w C, więc użyje couta z C++
cout<<*wsk<<endl;// <-- dereferencja, operacje na zmiennej wskazywanej przez wskaźnik

Spróbuj skompilować bez tej gwiazdki przed wsk, a wyjdzie ci jakiś dziwny ciąg znaków, oznaczający adres wskazywany przez wskaźnik.

Czyli definicyjnie, referencja mówi kompilatorowi, żeby nie skupiał się na wskaźniku, tylko na tym, co kryje się pod tym wskaźnikiem.

 

Nie wiem, czy o to ogólnie ci chodziło :).


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...