Sto giocherellando con i puntatori in C e sono ancora incerto su alcune basi. Sono venuto con il seguente codice esemplare:C: Accesso (int) via (void *) che punta a (void *) che punta a (int) per typecasting e dereferencing
#include <stdio.h>
int main(void)
{
int num = 42; // we want to access this integer
void *vptrB = # // pointer B points to the integer
void *vptrA = &vptrB; // pointer A points to pointer B
printf("%d\n", * (int *) * (void **) vptrA);
return 0;
}
La memoria deve essere simile a questa:
ci sono alternative per accedere al numero intero? Qualcosa di brutto/non sicuro con l'esempio? * (int *) * (void **) vptrA
è l'unico modo per accedere a num
tramite vptrA
e vptrB
?
Perché stai mantenendo i tuoi puntatori come "void *" invece di usare i tipi corretti? Dovresti provare a lavorare * con * il sistema di tipi, non combatterlo. –
Ouch; ricordami di non aver bisogno di leggere il tuo codice in futuro, per favore? È doloroso capire. Se puoi fare riferimento a 'vptrB', allora puoi renderlo più semplice, ma se puoi accedere solo a' vptrA', allora quello che hai scritto sembra corretto - ma non l'ho eseguito oltre un compilatore per ricontrollare che io ' L'ho interpretato come farebbe un compilatore. –
Direi che è di cattivo gusto usare "void *" in generale (specialmente in luoghi dove si potrebbe facilmente usare un puntatore digitato), e uno stile pessimo per mascherare il livello di riferimento indiretto (cioè memorizzare l'indirizzo di un 'vuoto * 'invece di un' vuoto ** '). E normalmente eviterei di lanciare nel mezzo del dereferenziamento, quindi dovrei '** ((int **) vptrA)'. – Zastai