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
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?
(*(x++))++
też zwiększa najpierw wskaźnik.
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.
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).
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.
@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).