English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Corso di base del linguaggio C

Controllo di flusso del linguaggio C

Funzione del linguaggio C

Array del linguaggio C

Puntatore del linguaggio C

Stringa del linguaggio C

Struttura del linguaggio C

File del linguaggio C

Altri C

Manuale di riferimento del linguaggio C

Puntatore void del linguaggio C

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.

Sintassi del puntatore void

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 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

Vantaggi dei puntatori void

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.

Perché usiamo i puntatori void?

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