Barninga Z
a- a+

L'aritmetica dei puntatori

PUNTATORI 

L'aritmetica deipuntatori 

Quanti byte di memoria occupa un array? La risposta dipende,ovviamente, dal numero degli elementi e dal tipo di datodichiarato. Un array di 20 interi occupa 40 byte, dal momentoche ogni int ne occupa 2. Un array di 20long ne occupa, dunque, 80. Calcoli analoghioccorrono per accedere ad uno qualsiasi degli elementi di unarray: il terzo elemento di un array di long haindice 2 e dista 8 byte (2*4) dall'inizio dell'areadi RAM riservata all'array stesso. Il quarto elemento diun array di int dista 3*2 = 6 byte dall'iniziodell'array. Generalizzando, possiamo affermare che ungenerico elemento di un array di un qualsiasi tipo distadall'indirizzo base dell'array stesso un numero dibyte pari al prodotto tra il proprio indice e la dimensionedel tipo di dato. 

Fortunatamente il compilatore C consente di accedere aglielementi di un array in funzione di un unico parametro: illoro  indice[20]. Per questo sono lecite e significativeistruzioni come quelle già viste: 

iArr[1] = 12;    printf("%X" ,iArr[j]);

E' il compilatore ad occuparsi di effettuare i calcolisopra descritti per ricavare il giusto offset in termini dibyte di ogni elemento, e lo fa in modo trasparente alprogrammatore per qualsiasi tipo di dato. 

Ciò vale anche per le stringhe (o array dicaratteri). Il fatto che ogni char occupi un bytesemplifica i calcoli ma non modifica i termini del problema[21]. 

E' importante sottolineare che quanto affermato vale nonsolo nei confronti degli array, bensì di qualsiasipuntatore, come può chiarire l'esempio chesegue. 

#includeint iArr[]= {12,99,27,0};void main(void){    int *iPtr;    iPtr = iArr;   // punta al primo elemento di iArr[]    while(*iPtr) {  // finche' l'int puntato da iPtr non e' 0  printf("%X -> %d" ,iPtr,*iPtr);// stampa iPtr e l'intero puntato  ++iPtr;  // incrementa iPtr    }}

 

Il trucco sta tutto nell'espressione ++iPtr:l'incremento del puntatore è automaticamenteeffettuato dal compilatore sommando 2 al valore contenuto iniPtr, proprio perché esso è unpuntatore ad int, e l'int occupa 2byte. In altre parole, iPtr è incrementato,ad ogni iterazione, in modo da puntare all'interosuccessivo. 

Si noti che l'aritmetica dei puntatori èapplicata dal compilatore ogni volta che una grandezza interaè sommata a (o sottratta da) un puntatore,moltiplicando tale grandezza per il numero di byte occupatidal tipo di dato puntato. 

Questo modo di gestire i puntatori ha due pregi: da un latoevita al programmatore lo sforzo di pensare ai dati inmemoria in termini di numero di byte; dall'altro consentela portabilità dei programmi che fanno uso dipuntatori anche su macchine che codificano gli stessi tipi didato con un diverso numero di bit. 

Un'ultima precisazione: ai putatori possono esseresommate o sottratte solo grandezze intere (int olong, a seconda che si tratti di puntatorinear o no). 

 



Ti potrebbe interessare anche

commenta la notizia