• 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

Object Storage Arubacloud
0 głosów
990 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 (212,670 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,370 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,370 p.)

To już kwestia gustu

(*w)++;

według mnie jest mniej czytelne niż

 *w = *w + 1;

 

Podobne pytania

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

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...