In questo tutorial, impareremo a conoscere i puntatori void e come usarli con l'aiuto di esempi.
Prima di procedere con questo tutorial, assicurati di controllare i puntatori C ++.
In C ++, non possiamo assegnare l'indirizzo di una variabile di un tipo di dati a un puntatore di un altro tipo di dati. Considera questo esempio:
// pointer is of int type int *ptr; // variable is of double type double d = 9.0; // Error // can't assign double* to int* ptr = &d;
Qui, l'errore si è verificato perché l'indirizzo è una double
variabile di tipo. Tuttavia, il puntatore è di int
tipo.
In tali situazioni, possiamo usare il puntatore a void (puntatori void) in C ++. Per esempio,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Il puntatore void è un puntatore generico che viene utilizzato quando non conosciamo il tipo di dati della variabile a cui punta il puntatore.
Esempio 1: C ++ Void Pointer
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void ptr = &f; cout << &f << endl; cout << ptr << endl; return 0; )
Produzione
0xffd117ac 0xffd117ac
Qui, al puntatore ptr
viene assegnato il valore di &f
.
L'output mostra che il puntatore void ptr memorizza l'indirizzo di una float
variabile f.
Poiché void
è un tipo vuoto, i puntatori void non possono essere dereferenziati.
void* ptr; float* fptr; float f = 2.3; // assign float address to void pointer ptr = &f; cout << *ptr << endl; // Error // assign float address to float pointer fptr = &f; cout << *fptr << endl; // Valid
Esempio 2: stampa del contenuto di Void Pointer
Per stampare il contenuto di un puntatore vuoto, usiamo l' static_cast
operatore. Converte il puntatore dal void*
tipo al rispettivo tipo di dati dell'indirizzo che il puntatore sta memorizzando:
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void pointer ptr = &f; cout << "The content of pointer is "; // use type casting to print pointer content cout << *(static_cast(ptr)); return 0; )
Produzione
Il contenuto del puntatore è 2.3
Questo programma stampa il valore dell'indirizzo puntato dal void
puntatore ptr.
Poiché non possiamo dereferenziare un void
puntatore, non possiamo usare *ptr
.
Tuttavia, se convertiamo il void*
tipo di puntatore nel float*
tipo, possiamo utilizzare il valore a cui punta il void
puntatore.
In questo esempio, abbiamo utilizzato l' static_cast
operatore per convertire il tipo di dati del puntatore da void*
a float*
.
Colata in stile C.
Possiamo anche usare il casting in stile C per stampare il valore.
// valid cout << *((float*)ptr);
Tuttavia, static_cast
è preferito alla fusione in stile C.
Nota: i puntatori void non possono essere utilizzati per memorizzare indirizzi di variabili con const
o volatile
qualificatori.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;