Wskaźniki

0

Czy mógłby ktoś mi wytłumaczyć jak działa arytmetyka wskaźników w c. Wiem ,że x++ oraz *x++ .zwiększa adres bo dodawanie ma większy priorytet od wskaźnika

0

Ale co np. z tym przykładem (*(x++))++. Teoretycznie nawiasy maja największy priorytet, czyli najpierw wskaźnik przeskakuje na kolejny adres a potem zwiększ wartość
Jest jednak na odwrót. Czy mógłby ktoś wytłumaczyć jak czytać wskaźniki w odpowiedniej kolejności?

0

(*(x++))++ też zwiększa najpierw wskaźnik.

0

Dzięki, ale to wiem. Nie rozumiem tylko dlaczego najpierw zwiększa wskaźnik a potem adres skoro x++ jest w nawiasie, czyli chyba ma największy priorytet.

1

Wskaźniki są liczbami, więc arytmetyka na wskaźnikach działa niemal tak samo jak arytmetyka na liczbach. Różnica jest tylko taka, że zwiększenie wskaźnika o 1 zwiększa go o wartość będącą długością danego typu w bajtach. Jeśli:

int  *x = (int*)1;

to

x + 1

zmieni wartość x z 1 na 5, gdyż typ int ma długość 4 bajtów.

(*(x++))++

To są trzy operacje: inkrementacja wskaźnika, dereferencja i inkrementacja wskazywanej wartości. Eksperyment do przeanalizowania:

int  main(void)
{
    char string[] = {'H','e','l','l','o','\0'}, *x;

    x = string;
    printf("%p: %s\n", x, x);
    x++;
    printf("%p: %s\n", x, x);
    *x++;
    printf("%p: %s\n", x, x);
    (*(x++))++;
    printf("%p: %s\n", x, x - 1);

    return 0;
}

Wynik:

0x7ffc9e8f6b62: Hello
0x7ffc9e8f6b63: ello
0x7ffc9e8f6b64: llo
0x7ffc9e8f6b65: mlo

(adresy mogą być inne).

1

Musisz rozróżnić wartość operacji od jej efektu pobocznego;

int a = 42;

Dla tego kodu, wartość a++ to 42, a jej efektem ubocznym - który wykona się w nieustalonym momencie przed najbliższym ; jest zwiększenie wartości a. To samo zachodzi w Twoim przykładzie.

1

@kq ma rację.

Moja sugestia - jeśli dopiero uczysz się programować i chcesz użyć operatorów ++ lub -- szczególnie w wersji postfiksowej to nie używaj w tym samym wyrażeniu absolutnie żadnego innego operatora - czyli ogranicz ich użycie do sytuacji

a++;
++a;
a--;
--a;

Nadużywanie tych operatorów bez dokładnego zrozumienia jak działają może bardzo łatwo doprowadzić do sytuacji w której dostaniesz UB (undefined behaviour).

1 użytkowników online, w tym zalogowanych: 0, gości: 1