Puntatori Speciali: void, std::byte e nullptr
Nella programmazione di sistema incontrerai spesso situazioni in cui i tipi “forti” non bastano, oppure dovrai esplicitamente segnalare che un puntatore non è associato a nulla.
Puntatori a void (void*)
Section titled “Puntatori a void (void*)”A volte il tipo puntato è irrilevante. In questi casi, puoi usare il puntatore void (void*).
Tuttavia, questi puntatori hanno pesanti restrizioni:
- Non puoi dereferenziare un
void*. Poiché il tipo è stato cancellato (erased), l’operazione non avrebbe senso per il compilatore (quanti byte deve leggere in memoria?). - Il C++ proibisce l’aritmetica dei puntatori sui
void*.
int number = 42;void* void_ptr = &number;// *void_ptr = 43; // ERRORE DI COMPILAZIONE!Puntatori a std::byte
Section titled “Puntatori a std::byte”Altre volte, vorrai interagire con la memoria “grezza” (raw) a livello di byte, per esempio durante la lettura di file non formattati, per criptare dati o per algoritmi di compressione.
Non puoi usare un void* per questi scopi perché le operazioni aritmetiche e bit-wise sono disabilitate. In questi casi, il C++ (da C++17) raccomanda l’uso di puntatori a std::byte. Un std::byte rappresenta un singolo byte in memoria permettendoti calcoli a basso livello.
nullptr ed Espressioni Booleane
Section titled “nullptr ed Espressioni Booleane”In C++, nullptr è uno speciale valore letterale. Generalmente, un puntatore che equivale a nullptr non punta a nulla. Si usa nullptr per segnalare errori o assenza di informazioni. Prima del C++11 si usava NULL o semplicemente 0, ma nullptr è type-safe e andrebbe sempre preferito.
Inoltre, i puntatori posseggono una conversione implicita in tipo bool:
- Qualsiasi valore che non sia
nullptrsi converte intrue. - Il valore
nullptrsi converte infalse.
Questa caratteristica è estremamente diffusa come idioma (idiom) per controllare l’esito di un’operazione, come ad esempio l’allocazione dinamica della memoria.