
//
// To jest przykładowy kod z podrozdziału 17.3 "Pamięć, adresy i wskaźniki" książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

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

int main()
{
    int  var = 17;
    int* ptr = &var;    // Zmienna ptr przechowuje adres obiektu o nazwie var.

    char  ch = 'c';
    char* pc = &ch;     // wskaźnik do char

    int  ii = 17;
    int* pi =&ii;       // wskaźnik do int

    cout << "pc==" << pc
        << "; contents of pc==" << *pc << "\n"; 
    cout << "pi==" << pi
        << "; contents of pi==" << *pi << "\n";

    *pc ='x';    // Dobrze: można przypisać znak 'x' do typu char wskazywanego przez pc.
    *pi = 27;    // Dobrze: wskaźnik int* wskazuje liczbę typu int, a więc *pi jest typu int.
    *pi = *pc;   // Dobrze: można przypisać typ char (pc) do typu int (pi).


    //int i = pi;  // Błąd: nie można przypisać typu int* do typu int.
    //pi = 7;      // Błąd: nie można przypisać typu int do typu int*.

    //pc = pi;     // Błąd: nie można przypisać typu int* do typu char*.
    //pi = pc;     // Błąd: nie można przypisać typu char* do typu int*.

    {
        char ch1 = 'a';
        char ch2 = 'b';
        char ch3 = 'c';
        char ch4 = 'd';
        //int* pi = &ch3; // Wskazuje ch3 — fragment pamięci o rozmiarze obiektu typu char.
                        // Błąd: nie można przypisać typu char* do typu int*,
                        // ale udajemy, że można.
        *pi = 12345;    // Zapis we fragmencie pamięci o rozmiarze obiektu typu int.
        *pi = 67890;
    }
}

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