#include <iostream>

using namespace std;

int* f(int& i) // referencja - masz 'widok' na oryginalna zmienna,
			  // modyfikujesz ja i zwracasz pointer na oryginal
{
    i += 4;
    return &i;
}

int g(int i) // kopia - modyfikujesz kopie i ja zwracasz
{
    return i *= 2;
}

void h(int* i) // bierzesz pointer na zmienna i ja zmieniasz - modyfikujesz oryginal
{
    *i -= 3;
}

int main()
{
    int A;
    A = g(3);
    cout << A; // A= 6
    A--;
    cout << A; // A= 5
    h(&A);
    cout << A; // A= 2
    (*f(A))--; // f(A) modyfikuje A i zwraca jego adres - pointer,
               // przez operator * robisz dereferencje (idziesz do obiektu)
               // i zmniejszasz oryinal
    cout << A; // A= 5 dlaczego?
    g(A);
    cout << A;
} // A=5 ale dlaczego?