Tieni presente che A è un doppio puntatore ...
A[0] + i
non ha senso perché sommi un intero ad un puntatore.
L'altra puoi scriverla nei due modi
*((int *)*(A+i))
*(((int *)(*A)+i))
Ultima modifica di oregon; 12-04-2016 a 14:57
No MP tecnici (non rispondo nemmeno!), usa il forum.
Si , e qui ci siamo... stò cercando di immaginare uno schema per rappresentare il tutto.
**A = |void*|void*|void*|void*|void*|
dall'esempio, ogni elemento di A, contiene un indirizzo di memoria che punta ad un intero, per cui, effettuerò un cast in int*.
Ora mi domandavo:
(*A)+i
i incrementa da 0 a 4 ... *A può essere tradotto in A[0], cioè il primo elemento dell'array(che è un indirizzo).
Facendo (*A)+0,(*A)+1,(*A)+2,(*A)+3,(*A)+4 ...
per cui (*A)+0 => restituisce il primo indirizzo presente nell'array (void* che conterrà l'indirizzo &B[0] del primo intero..)
(*A)+1 => il secondo indirizzo dell'array..
e cosi vià...
Credo che ora mi è tutto chiaro![]()
Con i sogni possiamo conoscere il futuro...
Ultima modifica di oregon; 12-04-2016 a 15:02
No MP tecnici (non rispondo nemmeno!), usa il forum.
sono assolutamente d'accordo... ma non a caso , gli elementi di A assumono tutti indirizzi che puntano a interi...(l'avevo dato per scontato)... volevo solo capire se il ragionamento che ho scritto sopra era corretto...
**A = |void*|void*|void*|void*|void*|
dall'esempio, ogni elemento di A, contiene un indirizzo di memoria che punta ad un intero, per cui, effettuerò un cast in int*.
Ora mi domandavo:
(*A)+i
i incrementa da 0 a 4 ... *A può essere tradotto in A[0], cioè il primo elemento dell'array(che è un indirizzo).
Facendo (*A)+0,(*A)+1,(*A)+2,(*A)+3,(*A)+4 ...
per cui (*A)+0 => restituisce il primo indirizzo presente nell'array (void* che conterrà l'indirizzo &B[0] del primo intero..)
(*A)+1 => il secondo indirizzo dell'array..
e cosi vià...
Con i sogni possiamo conoscere il futuro...
In definitiva, senza dubbio, questo è il modo più chiaro:
Qui capisco palesemente che scorro gli elementi di A (che sono dei void* contenente degli indirizzi), per poi effettuare il cast.codice:printf("A[%d] = %d\n",i, *(((int *)*(A+i))));
Con i sogni possiamo conoscere il futuro...
Oregon, aggiungo:
l'inizializzazione del puntatore doppio, compila ed è funzionante anche in questo modo:
senza usare il for per allocare i singoli elementi...codice:void **A = malloc(sizeof(void*)*5); /*for(int i=0; i<5; i++){ A[i] = (void*)malloc(sizeof(void*)); }*/
Con i sogni possiamo conoscere il futuro...