/**** puntatori ****/ #include using namespace std; // prototipi di funzione void assegnazione(); void dimensione_puntatore(); void puntatori_const(); void casting(); int main(){ casting(); return 0; } void casting(){ int i = -1; int* ptr_int = &i; /* trasformo il puntatore da puntatore a intero a puntatore a unsigned intero quindi stamperà 4294967295 perchè interpreta il valore puntato come unsigned */ cout<<*((unsigned int*)ptr_int)<(ptr_void)); // Il tipo void* può sempre essere castato //cout<<*(static_cast(ptr_int)); // errore. Non avrebbe dato errore con il cast normale } void puntatori_const(){ const char carattere_const = 'a'; char carattere = 'b'; /* ----- CONST TYPE* PTR ----- */ // Se una variabile è const anche il suo puntatore deve esserlo // char* ptr = carattere_const; // errore const char* ptr = &carattere_const; // OK /* Se un puntatore è const char*, non posso modificare il valore della variabile, ma posso modificare il valore del puntatore in sè */ // *ptr = 'z'; //errore ptr = &carattere; //ok /* ----- CONST TYPE* CONST PTR ----- */ /* const char* const vuol dire che è un puntatore const che non può neanche modificare il valore del puntatore in sè */ const char* const ptr2 = &carattere_const; // *ptr2 = 'z'; //errore // ptr2 = &carattere; //errore /* ----- TYPE* CONST PTR ----- */ /* Punta a tipi non-const ma il suo valore non può essere cambiato, ovvero non può puntare a locazioni diverse rispetto alla dimensione_puntatore inizializzazione */ char* const ptr3 = &carattere; *ptr3 = 'k'; // OK char carattere2 = 's'; //ptr3 = &carattere2; // errore } void dimensione_puntatore(){ /* la dimensione di un puntatore non dipende dal tipo a cui punta dato che deve semplicemente essere abbastanza grande per individuare una cella di memoria */ long double* ptr1 = nullptr; char* ptr2 = nullptr; cout<