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

inkrementacja zmiennej przez funkcję pobierającą wskaźnik - dziwne wyjście

0 głosów
1,513 wizyt
pytanie zadane 22 sierpnia 2017 w C i C++ przez daniel1806 Obywatel (1,780 p.)

Witam :)

problem występuje w poniższym kodzie:

#include <iostream>

using namespace std;

int wskaznik(int *w)
{
    *w++;
    return *w;
}

int main()
{
    int *a;
    int b = 200;
    a = &b;

    cout << wskaznik(a) << endl;
    cout << b;

    return 0;
}

Na wyjściu w konsoli mam takie wartości:

2686728

200

Spodziewałem się wyniku:

201

201

Wystarczy że dokonam drobnej modyfikacji i w funkcji wskaznik zamienię *w++ na ++*w i otrzymuję to o co mi chodziło. I tu jest moje pytanie. Dlaczego program zachowuje się tak dziwnie i w przypadku postinkrementacji w ogóle nie zwiększa wartości zmiennej b, natomiast wskaźnik przestawia się na jakąś przypadkową wartość?

 

4 odpowiedzi

+2 głosów
odpowiedź 22 sierpnia 2017 przez vector Dyskutant (9,200 p.)
Wyrażenie *w++ najpierw zwiększa wartość zmiennej w a dopiero później wyłuskuje wartość z wskaźnika czyli to wyrażenie jest równoważne z *(w++). Dzieje się tak z powodu kolejności aplikowanych operatorów w c++.
+1 głos
odpowiedź 22 sierpnia 2017 przez unknown Nałogowiec (39,560 p.)
0 głosów
odpowiedź 22 sierpnia 2017 przez Ehlert Ekspert (215,230 p.)

Zauważ co przekazujesz do zmiennej. Wskaźnik! Musisz więc w funkcji dać jako argument wskaźnik na wskaźnik.

foo(int** ultraPointer)
{
    **ultraPointer++;
}

//...

int * wsk = ...tere fere..;
foo(&wsk);
komentarz 22 sierpnia 2017 przez unknown Nałogowiec (39,560 p.)
Ale autorowi pytania chodziło o coś innego.
0 głosów
odpowiedź 22 sierpnia 2017 przez Bondrusiek Maniak (61,460 p.)

Witam,

tak już zostało tu wspomniane przyczyną błędu jest kolejność działania operatorów. Kiedy nie jesteś pewien kolejności postaraj się rozbić wyrażenie. Np w tym przypadku

 *w = *w + 1;

Poprawiony kod

#include <iostream>

using namespace std;

int wskaznik(int *w)
{
    *w = *w + 1;
    return *w;
}

int main()
{
    int *a;
    int b = 200;
    a = &b;

    cout << wskaznik(a) << endl;
    cout << b;

    return 0;
}

 

komentarz 22 sierpnia 2017 przez unknown Nałogowiec (39,560 p.)
Lepiej użyć nawiasów
komentarz 22 sierpnia 2017 przez Bondrusiek Maniak (61,460 p.)

To już kwestia gustu

(*w)++;

według mnie jest mniej czytelne niż

 *w = *w + 1;

 

Podobne pytania

+2 głosów
2 odpowiedzi 718 wizyt
pytanie zadane 10 marca 2022 w C i C++ przez Bilib Użytkownik (990 p.)
0 głosów
2 odpowiedzi 2,488 wizyt
pytanie zadane 7 listopada 2022 w Python przez niezalogowany
+1 głos
0 odpowiedzi 815 wizyt
pytanie zadane 12 marca 2022 w C i C++ przez Bilib Użytkownik (990 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,319 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...