W funkcji f() używasz przy pobraniu parametru wskaźnika na int (int *x). Wywołując funkcje f() podajesz argument &z co znaczy, że odwołuje się się do zmiennej z czyli ten wskaznik *x modyfikuje także zmienną z i teraz będzie tam nie 2 a 2+3=5, taki sam wynik zwroci do y. Gdybyś zrobił parametry bez wskaźników
int f(int x)
int y = f(z);
wtedy ta funkcja utworzyła by sobie własną zmienną x (kopię z) i w tej zmiennej z nic nie zmieniała a po prostu skopiowała wartość i zwróciła po obliczeniach wynik do y.