#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?
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCogZihpbnQmIGkpIC8vIHJlZmVyZW5jamEgLSBtYXN6ICd3aWRvaycgbmEgb3J5Z2luYWxuYSB6bWllbm5hLAoJCQkgIC8vIG1vZHlmaWt1amVzeiBqYSBpIHp3cmFjYXN6IHBvaW50ZXIgbmEgb3J5Z2luYWwKewogICAgaSArPSA0OwogICAgcmV0dXJuICZpOwp9CgppbnQgZyhpbnQgaSkgLy8ga29waWEgLSBtb2R5ZmlrdWplc3oga29waWUgaSBqYSB6d3JhY2Fzegp7CiAgICByZXR1cm4gaSAqPSAyOwp9Cgp2b2lkIGgoaW50KiBpKSAvLyBiaWVyemVzeiBwb2ludGVyIG5hIHptaWVubmEgaSBqYSB6bWllbmlhc3ogLSBtb2R5ZmlrdWplc3ogb3J5Z2luYWwKewogICAgKmkgLT0gMzsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgQTsKICAgIEEgPSBnKDMpOwogICAgY291dCA8PCBBOyAvLyBBPSA2CiAgICBBLS07CiAgICBjb3V0IDw8IEE7IC8vIEE9IDUKICAgIGgoJkEpOwogICAgY291dCA8PCBBOyAvLyBBPSAyCiAgICAoKmYoQSkpLS07IC8vIGYoQSkgbW9keWZpa3VqZSBBIGkgendyYWNhIGplZ28gYWRyZXMgLSBwb2ludGVyLAogICAgICAgICAgICAgICAvLyBwcnpleiBvcGVyYXRvciAqIHJvYmlzeiBkZXJlZmVyZW5jamUgKGlkemllc3ogZG8gb2JpZWt0dSkKICAgICAgICAgICAgICAgLy8gaSB6bW5pZWpzemFzeiBvcnlpbmFsCiAgICBjb3V0IDw8IEE7IC8vIEE9IDUgZGxhY3plZ28/CiAgICBnKEEpOwogICAgY291dCA8PCBBOwp9IC8vIEE9NSBhbGUgZGxhY3plZ28/