Domanda

Sto leggendo del codice nell'implementazione Ogre3D e non riesco a capire cosa sia un void * indica la variabile di tipo. Cosa significa un puntatore a void in C ++?

È stato utile?

Soluzione

Un puntatore a vuoto, void * può puntare a qualsiasi oggetto:

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

Non puoi dereferenziare, incrementare o decrementare quel puntatore, perché non sai a quale tipo puntare. L'idea è che void * può essere utilizzato per funzioni come memcpy che copiano solo blocchi di memoria e non si preoccupano del tipo che copiano.

Altri suggerimenti

È solo un puntatore generico, utilizzato per passare i dati quando non si conosce il tipo. Devi lanciarlo nel tipo corretto per usarlo.

È un puntatore non elaborato a un punto della memoria. Non consente l'aritmetica di puntatori come char * o int *.

Ecco alcuni esempi di utilizzo

http://theory.uwinnipeg.ca/programming/node87.html

È un puntatore a qualsiasi cosa - solo un pezzo di memoria con cui puoi giocare - potrebbe essere un oggetto, potrebbe essere un carattere. Devi lanciare un cast per fare qualcosa di utile.

Sviluppando le mie pubblicazioni precedenti ...


ATTENZIONE: tutti gli indirizzi di memoria qui sono fittizi. Li sto solo inventando per illustrare un punto.


Data:

int data[] = {10,11,12};

Ora abbiamo:

0xffff0000-0xffff0003  with a value of (int)(10)
0xffff0004-0xffff0007  with a value of (int)(11)
0xffff0008-0xffff000b  with a value of (int)(12)

(Non non entrerò nell'ordinamento di byte big-endian vs little-endian qui.)

Se abbiamo:

int * p = data;

Ora abbiamo un'altra posizione di memoria da qualche altra parte, diciamo:

 0xaaaa0000-0xaaaa0003  with a value of (int*)0xffff0000

Possiamo usare p [1] [o * (p + 1)] per riferirci a * (int *) (0xffff0004) [= 11] come sizeof (int) = 4 e 0xffff0000 + sizeof (int) = 0xffff0004.

Se abbiamo:

void * v = data;

Ora abbiamo un'altra posizione di memoria da qualche altra parte, diciamo:

 0xbbbb0000-0xbbbb0003  with a value of (void*)0xffff0000.

Tuttavia, void non ha alcuna informazione sizeof () associata. Non possiamo aumentare o diminuire il puntatore. Non possiamo dedurre l'accesso ai dati memorizzati in 0xffff0000. Possiamo utilizzare il valore solo come indirizzo di memoria non elaborata.

Se vogliamo usare i dati memorizzati in (void *) 0xffff0000, dobbiamo prima lanciarli su un tipo appropriato.

Detto questo, (void *) è ancora abbastanza utile come mezzo per passare indirizzi a strutture di dati arbitrarie. Ad esempio, memset (). Non importa se sto eliminando una struct tm o una struct sockaddr . Abbiamo solo bisogno di un puntatore alla struttura e alle sue dimensioni.

(Questo dovrebbe essere ovvio, ma ... Attenzione usando memset per azzerare un'istanza di classe e, nel fare ciò, sovrascrivere la tabella dei puntatori virtuali.)

Un puntatore vuoto non può puntare a un membro della classe in C ++.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top