Quindi, se io dovessi scrivere:Come detto dal signore del tempo, sono dei cast espliciti, li ho usati per lo più per chiarezza, anche se il (void*) è necessario quando mandi in output l'indirizzo puntato da un puntatore char. Infatti il cout interpreta il puntatore come carattere da stampare, quindi senza cast va a stampare il valore puntato interpretandolo come carattere ASCII.
In C++ i cast sono regolati in modo particolare per lo più per le classi, quando parliamo di puntatori a valori primitivi, in realtà non c'è molta differenza d'uso. I cast espliciti sono utili per applicazioni ad alta efficienza quando si lavora direttamente su dati in memoria, in quel caso tipicamente il C++ regredisce a C. Nel C++ di solito si usano funzioni di cast per i primitivi e si sfrutta il dynamic lookup per le classi, ma sono aspetti un po' più complessi da trattare (all'università ho fatto un corso da 10 crediti nel quale per metà del tempo si è parlato quasi esclusivamente del dynamic lookup e tipizzazione di C++ comparato ad altri linguaggi).
ps: Mi correggo per il post precedente, ho scritto che l'unsigned int viene memorizzato in big endian, ma non è stata una svista (per lo più un mistype). Anche dall'output è evidente che è il contrario: little endian. Infatti vengono prima letti i byte meno significativi.
char* P;
char X[] = "Ciao";
P = &X;
Per utilizzare P in cout devo scrivere:
cout << (void*) P << endl;
Giusto?