Cos'è void* in C e C++

Cos E Void In C E C



C e C++ sono due linguaggi di programmazione che fanno molto affidamento sui puntatori per la gestione della memoria e la manipolazione dei dati. I puntatori sono variabili che memorizzano gli indirizzi di memoria, che consentono ai programmi di accedere e manipolare i dati archiviati in memoria. Un tipo speciale di puntatore è il puntatore vuoto (void*) , noto anche come a puntatore generico .

Che cos'è un puntatore vuoto (void*)?

Un puntatore void, noto anche come puntatore generico, è un puntatore che non è associato a nessun tipo di dati specifico, rendendolo adatto a puntare a qualsiasi tipo di dati. In altre parole, A puntatore vuoto può puntare a un numero intero, un carattere, una stringa o qualsiasi altro tipo di dati. Questa flessibilità rende i puntatori void uno strumento potente nella programmazione C e C++.

Dichiarazione di Void Pointer in C e C++

In C e C++, il puntatore vuoto viene dichiarato attraverso la seguente sintassi:







vuoto * ptr ;

Utilizzo di Void Pointer in C e C++

Puntatori vuoti in C vengono utilizzati principalmente quando il tipo di dati di una variabile non è noto o può variare in fase di esecuzione. Consentono un modo generico per archiviare e manipolare i dati senza la necessità di conoscerne il tipo specifico. È utile soprattutto quando si ha a che fare con funzioni o strutture di dati in grado di gestire diversi tipi di dati.



Un uso comune di puntatori vuoti è nelle funzioni di allocazione della memoria come malloc() che restituisce un puntatore vuoto a un blocco di memoria che può essere utilizzato per memorizzare qualsiasi tipo di dati. Il programmatore può quindi trasmettere il puntatore void al tipo di dati appropriato per accedere e manipolare i dati memorizzati nel blocco di memoria allocato.



Un altro uso dei puntatori void in C è in puntatori di funzione , che sono variabili che memorizzano l'indirizzo di memoria di una funzione. I puntatori void possono essere utilizzati per archiviare l'indirizzo di memoria di qualsiasi funzione, indipendentemente dal tipo restituito o dall'elenco dei parametri, consentendo una maggiore flessibilità nell'utilizzo dei puntatori a funzione.





L'impiego di puntatori vuoti in C++ è quasi simile, tuttavia possono essere utilizzati anche per creare un'interfaccia generica per oggetti di classi diverse. Ciò si ottiene spesso attraverso l'uso di funzioni virtuali, che consentono di trattare in modo uniforme oggetti di classi diverse. Inoltre, C++ offre un controllo del tipo più rigoroso rispetto a C, il che significa che using puntatori vuoti in modo errato può causare più errori e bug.

Punti da considerare durante l'utilizzo dei puntatori Void in C e C++

Ecco alcuni punti che dovresti considerare durante l'utilizzo puntatori vuoti in C e C++.



1: In Do, vuoto* può essere utilizzato come valore di ritorno e parametro di funzione, ma in C++ è necessario disporre di un tipo di dati specifico di puntatore.

Per esempio:

In C, il codice è riportato di seguito:

#include

#include

vuoto * add_numbers ( int UN , int B ) {

int * risultato = malloc ( taglia di ( int ) ) ;

* risultato = UN + B ;

ritorno ( vuoto * ) risultato ;

}

vuoto stampa_risultato ( vuoto * risultato ) {

int * ptr = ( int * ) risultato ;

printf ( 'Il risultato è: %d \N ' , * ptr ) ;

gratuito ( ptr ) ;

}

int principale ( ) {

int num1 = 5 , num2 = 7 ;

vuoto * risultato = add_numbers ( num1 , num2 ) ;

stampa_risultato ( risultato ) ;

ritorno 0 ;

}

Il codice precedente definisce una funzione aggiungi_numeri() che restituisce a vuoto* puntatore al risultato dell'aggiunta di due numeri interi passati come argomenti. La funzione stampa_risultato() prende un puntatore void* e stampa il risultato. Nella funzione main(), chiamiamo aggiungi_numeri() e passare il risultante puntatore void* A stampa_risultato() da stampare.

In C++ è richiesto un tipo di dati specifico.

#include

utilizzando lo spazio dei nomi std ;

vuoto stampaInt ( int * nessuno ) {

cout << 'Il numero intero è: ' << * nessuno << finel ;

}

int principale ( ) {

int X = 10 ;

int * ptr = & X ;

stampaInt ( ptr ) ;

ritorno 0 ;

}

2: In C, puoi convertire il puntatore void in un altro tipo di puntatore attraverso conversione implicita. Ma in C++ devi usare il conversione esplicita per convertire il puntatore vuoto a qualsiasi altro tipo di puntatore.

Ecco un semplice esempio di codice sia per C che per C++ per illustrare la differenza tra il implicito E conversione esplicita Di puntatori vuoti ad altri tipi di puntatore:

In C viene utilizzato il seguente codice:

#include

vuoto printChar ( vuoto * cap ) {

char C = * ( char * ) cap ;

printf ( '%C \N ' , C ) ;

}

int principale ( ) {

char C = 'UN' ;

vuoto * ptr = & C ;

printChar ( ptr ) ;

ritorno 0 ;

}

Il codice precedente definisce una funzione printChar che accetta un puntatore void come parametro e stampa il carattere memorizzato in quella posizione di memoria. Nella funzione principale, una variabile char C è definito e il suo indirizzo è memorizzato in un puntatore void ptr. IL printChar la funzione viene quindi chiamata con il puntatore vuoto 'ptr' come argomento. Il puntatore void viene esplicitamente convertito in un puntatore char nel file 'stampaCarattere' funzione per accedere e stampare il valore memorizzato in 'C' .

In C++, il codice è riportato di seguito:

#include

vuoto stampaInt ( vuoto * nessuno ) {

int * ptr = statico_cast < int *> ( nessuno ) ;

standard :: cout << * ptr << standard :: finel ;

}

int principale ( ) {

int X = 10 ;

vuoto * ptr = & X ;

stampaInt ( ptr ) ;

ritorno 0 ;

}

Il codice precedente definisce una funzione stampaInt che prende un puntatore void num come parametro e lo lancia su un puntatore intero usando il operatore static_cast . La funzione quindi stampa il valore dell'intero puntato dal puntatore cast. Nella funzione principale, viene definita una variabile intera x e il suo indirizzo viene memorizzato in a puntatore vuoto ptr, che viene poi passato al stampaInt funzione. L'output del programma è il valore di x, che è 10.

Pensieri finali

IL vuoto i puntatori in C e C++ forniscono un modo efficace per manipolare i dati senza bisogno di conoscerne il tipo specifico. Sono utili per l'allocazione della memoria e i puntatori a funzione, nonché per creare un'interfaccia generica per oggetti di classi diverse in C++. Tuttavia, è importante considerare le differenze tra C e C++ nel loro utilizzo di puntatori vuoti , come la necessità di tipi di dati specifici in C++ e la necessità di una conversione esplicita durante il cast di puntatori void ad altri tipi di puntatore. Un attento esame di questi punti può portare a un uso più efficiente ed efficace di puntatori vuoti nella programmazione.