English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Fino ad ora, abbiamo studiato che l'indirizzo assegnato al puntatore dovrebbe essere lo stesso del tipo specificato nella dichiarazione del puntatore. Ad esempio, se dichiariamo un puntatore int, questo puntatore int non può puntare a una variabile float o a un altro tipo di variabile, ovvero può puntare solo a variabili di tipo int. Per superare questo problema, abbiamo utilizzato il puntatore void. Il puntatore void è un puntatore universale che può puntare a qualsiasi tipo di dati. Possiamo assegnare l'indirizzo di qualsiasi tipo di dati a un puntatore void e possiamo assegnare un puntatore void a qualsiasi tipo di puntatore senza eseguire alcuna conversione di tipo esplicita.
void *pointer name;
Di seguito è riportata la dichiarazione del puntatore void:
void *ptr;
Nella dichiarazione sopra, void è il tipo del puntatore e 'ptr' è il nome del puntatore.
Lasciate che vediamo alcuni esempi:
int i=9; // inizializzazione della variabile di tipo int int *p; // dichiarazione del puntatore a int float *fp; // dichiarazione del puntatore a float void *ptr; // dichiarazione del puntatore void p=fp; // errato. fp=&i; // errato ptr=p; // corretto ptr=fp; // corretto ptr=&i; // corretto
La dimensione del puntatore void in C è la stessa della dimensione del puntatore di tipo carattere. La rappresentazione del puntatore void è la stessa del puntatore di tipo carattere. La dimensione del puntatore varia a seconda della piattaforma utilizzata.
Vediamo l'esempio seguente:
#include <stdio.h> int main() { void *ptr = NULL; // Puntatore void int *p = NULL; // Puntatore int char *cp = NULL; // Puntatore char float *fp = NULL; // Puntatore float //Dimensione del puntatore void printf("Dimensione del puntatore void = %d\n\n", sizeof(ptr)); //Dimensione del puntatore int printf("Dimensione del puntatore int = %d\n\n", sizeof(p)); //Dimensione del puntatore char printf("Dimensione del puntatore char = %d\n\n", sizeof(cp)); //Dimensione del puntatore float printf("Dimensione del puntatore float = %d\n\n", sizeof(fp)); return 0; }
Risultato di output
Dimensione del puntatore void = 4 Dimensione del puntatore int = 4 Dimensione del puntatore char = 4 Dimensione del puntatore float = 4
Ecco i vantaggi dei puntatori void:
Le funzioni malloc() e calloc() restituiscono puntatori void, quindi queste funzioni possono essere utilizzate per allocare memoria per qualsiasi tipo di dati.
#include <stdio.h> #include<malloc.h> int main() { int a=90; int *x = (int*)malloc(sizeof(int)); x=&a; printf("Valore puntato dal puntatore x: %d", *x); return 0; }
Risultato di output
Valore puntato dal puntatore x: 90
I puntatori void in C possono anche essere utilizzati per implementare funzioni generiche in C.
Grazie alla sua reusabilità, utilizziamo puntatori void. I puntatori void possono memorizzare qualsiasi tipo di oggetto e possiamo recuperare qualsiasi tipo di oggetto utilizzando l'operatore di indirezione con appropriata conversione di tipo.
Lasciamo che vediamo un esempio per capire.
#include<stdio.h> int main() { int a=56; // Inizializzazione di una variabile intera 'a'. float b=4.5; // Inizializzazione della variabile float 'b'. char c='k'; // Inizializzazione della variabile char 'c'. void *ptr; // Dichiarazione del puntatore vuoto. //Assegna l'indirizzo al variabile "a". ptr=&a; printf("Il valore di a è: \n%d", *((int*)ptr)); //Assegna l'indirizzo al variabile 'b'. ptr=&b; printf("\nIl valore di b è: \n%f", *((float*)ptr)); //Assegna l'indirizzo alla variabile 'c'. ptr=&c; printf("\nIl valore di c è: %c", *((char*)ptr)); return 0; }
Risultato di output
Il valore di a è: 56 Il valore di b è: 4.500000 Il valore di c è: k