
//
// To jest przykładowy kod z podrozdziału 17.9.1 „Wskaźniki i referencje jako parametry” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

//------------------------------------------------------------------------------

int  incr_v(int x) { return x+1; } // Oblicza nową wartość i ją zwraca.
void incr_p(int* p) { ++*p; }      // przekazanie wskaźnika
                                   // (wyłuskanie go i inkrementacja wyniku)
void incr_r(int& r) { ++r; }       // przekazanie referencji
void incr_p(char* p)
{
    if (p==0) error("Zerowy wskaźnik podany jako argument funkcji incr_p().");
    ++*p; // Dereferencja wskaźnika i inkrementacja wskazywanego przez niego obiektu.
}

//------------------------------------------------------------------------------

int main()
try
{
    {
        int x = 2;
        x = incr_v(x); // Kopiuje x do incr_v(); następnie kopiuje wynik na zewnątrz i przypisuje go.
    }

    // Użycie wskaźnika jako argumentu jest znakiem dla programisty, że coś może się zmienić.
    {
        int x = 7;
        incr_p(&x);    // Operator & jest potrzebny.
        incr_r(x);
    }

    // Ktoś mógłby to wywołać przy użyciu pustego wskaźnika.
    {
        //incr_p(0);     // Awaria: funkcja incr_p() będzie próbować wyłuskać 0.
        char* p = 0;
        incr_p(p);     // Awaria: funkcja incr_p() będzie próbować wyłuskać 0.
    }
}
catch (exception& e) {
    cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek!\n"; 
    return 2;
}

//------------------------------------------------------------------------------
