• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wskazniki - nie rozymiem...

VPS Starter Arubacloud
+3 głosów
297 wizyt
pytanie zadane 13 sierpnia 2015 w C i C++ przez rafalmagician Obywatel (1,320 p.)

Cyba nigdy się nie nauczę wskaźników :(

Może ktoś mi to wytłumaczyć jak dla głupka ?? Czyli mnie :)

#include <stdio.h>
#include <stdlib.h>

void write(int *x);

void read(int *x);

int main()
{
    int n;

        write(&n);

        read(&n);

    return 0;
}

void write(int *x)
{
    scanf("%d",&x);
}

void read(int *x)
{
    printf("%d \n",*x);
}

Bo źle mi wyświetla zamiast tego co wpisze, wyświetla za każdym razem 2. I nie wiem dlaczego... Help :(

4 odpowiedzi

+2 głosów
odpowiedź 13 sierpnia 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 13 sierpnia 2015 przez Dorion300
Wywal & w scanf po próbujesz zdobyć adres wskaźnika. A funkcja potrzebuje adres zmiennej (czyli samego wskaźnika)
komentarz 13 sierpnia 2015 przez rafalmagician Obywatel (1,320 p.)
Dzięki działa :) A teraz przydało by się jakieś tłumaczenie żebym do końca życia już sobie to zapamiętał :)
komentarz 13 sierpnia 2015 przez Dorion300 Szeryf (90,250 p.)
Za pomocą & zdobywamy adres do zmiennej, jak widać scanf potrzebuje właśnie adresu do tej zmiennej, my oferujemy na wskaźnikach przez co wystarczy podać sam wskaźnik gdyż to właśnie on posiada adres do zmiennej i aby zdobyć zmiennę: trzeba podać * przed wskaźnik.
komentarz 13 sierpnia 2015 przez Patrycjerz Mędrzec (192,340 p.)

Oto takie proste wademekum:

  • Wskaźnik - zmienna adresowa, która wskazuje na zmienną/wskaźnik
  • & - operator pobrania adresu (wskaźnika) z danej zmiennej/wskaźnika
  • * - operator wyłuskania wartości, na którą wskazuje wskaźnik (zmienna/wskaźnik)
  • Mogą istnieć wskaźniki na inne wskaźniki. Teoretycznie taki ciąg może być nieskończony (ale nie jest)
  • Jeśli przekazujesz wskaźnik do funkcji, to pracujesz w niej na oryginalnych danych (ale w C++ zaleca się stosowanie referencji)
  • -> - operator wyłuskania pola/metody ze wskaźnika obiektu
  • Nazwa tablicy jest jednocześnie stałym wskaźnikiem na jej pierwszy element
+2 głosów
odpowiedź 13 sierpnia 2015 przez Krawiec91 Pasjonat (19,600 p.)

Po co się samobiczowaćsmiley no chyba, że ktoś lubi takie zabawy. Ale wracając do tematu
Jak widzę, po wcześniejszych komentarzach to problem został rozwiązany. Co do wskaźników:
 

int zmienna1=5;      \\zmienna, czyli liczba

int* wsk_zmienna1;  \\wskaźnik, czyli adres.

wsk_zmienna1=&zmienna1;  \\inicjalizacja wskaźnika adresem zmienna1, 
                                            \\dlatego znak & się pojawia
                                            \\przypisanie adresu do adresu

int zmienna2=*wsk_zmienna1; \\przypisanie do zmienna2 wartości wyłuskanej spod wskaźnika wsk_zmienna1
                                              \\czyli do zmiennej(liczby) przypisujesz zmienną (liczbę)
                                             

Można powiedzieć, że każda zmienna ma następujące atrybuty:
- typ, czyli do przechowywania jakichś wartości jest przeznaczona oraz wiąże się z tym ile pamięci musi być na nią przeznaczone,
- nazwa - żeby nam programistom było poręczniej się nią obsługiwać
- adres - miejsce w pamięci, gdzie jest przechowywania
- wartość - to co przechowuje, np. liczba całkowita, liczba zmiennoprzecinkowa, łańcuch znakowy.
Więc do posługiwania się zmienną możesz używać albo jej nazwy albo jej adresu.

Użycie nazwy zostało pokazane w pierwszej instrukcji kodu, który zamieściłem. Przypisuję tam do zmiennej liczbę 5.

Drugą instrukcją było utworzenie wskaźnika, czyli zmiennej przechowywującej adres. Następnie dokonałem inicjalizacji utworzonego wcześniej wskaźnika. Wskaźnik przechowuje adres, więc powinienem mu przypisać jakiś adres. Do wyciągnięcia adresu zmiennej służy operator &. Dzięki temu do wskaźnika wsk_zmienna1 przypisałem adres zmiennej o nazwie zmienna1.

Ostatnia instrukcja w kodzie to utworzenie zmiennej zmienna2 do której przypisałem wartość znajdującą się pod adresem przechowywanym przez wskaźnik wsk_zmienna1. Jeśli chcę coś przypisać do zmiennej przechowującą liczbę, to musi być to liczba. Do wyciągnienia wartości spod wskaźnika, służy operator *. Po wyciągnięciu wartości znajdującej się pod danym adresem (wskaźnikiem) mogę ją spokojnie przypisać do zmiennej zmienna2.

Co do początkowych bojów ze wskaźnikami, radziłbym uwagę, może nie aż taką jak przy przechodzeniu przez nierozminowane pole minowesmiley. Ale po prostu zastanowienie sie nad czym w danej chwili operujesz, czy nad wartością czy na adresem. Załóżmy masz utworzoną zmienną, utworzony wskaźnik i chcesz przypisać adres zmiennej do wskaźnika. Piszesz nazwę wskaźnika, stawiasz operator przypisania i kminisz "Po lewej stronie przypisania jest wskaźnik, czyli do niego muszę przypisać jakiś adres. Czyli muszę wyciągnąć adres tej utworzonej wcześniej zmiennej, czyli po prawej stronie przypisania stawiam &zmienna".

0 głosów
odpowiedź 13 sierpnia 2015 przez Patrycjerz Mędrzec (192,340 p.)

Tak jak kolega mówił, w funkcji scanf powinno być samo x, bez &. A dlaczego? Bo dając operator pobrania adresu wskaźnika, funkcji przekazujesz wskaźnik do wskaźnika, a tego nie chcesz wink

0 głosów
odpowiedź 14 sierpnia 2015 przez mrcnsct Nałogowiec (36,390 p.)

Polecam ten film https://www.youtube.com/watch?v=KaIFM5d4qds, może Ci się trochę rozjaśni.

Podobne pytania

0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez demon1234 Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 487 wizyt
pytanie zadane 12 grudnia 2018 w C i C++ przez Padoski Użytkownik (990 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...