Skip to content

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.

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!

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.

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 nullptr si converte in true.
  • Il valore nullptr si converte in false.

Questa caratteristica è estremamente diffusa come idioma (idiom) per controllare l’esito di un’operazione, come ad esempio l’allocazione dinamica della memoria.